精华内容
下载资源
问答
  • 2018-08-01 10:43:41

    java 写入修改word 文档,附简单代码

    package com.example.demo;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.Dispatch;
    import com.jacob.com.Variant;
    
    public class WordTest {
    	// word文档
    	private Dispatch doc;
    
    	// word运行程序对象
    	private ActiveXComponent word;
    
    	// 所有word文档集合
    	private Dispatch documents;
    
    	// 选定的范围或插入点
    	private Dispatch selection;
    
    	private boolean saveOnExit = true;
    
    	/**
    	 * 
    	 * @param visible
    	 *            为true表示word应用程序可见
    	 */
    	public WordTest(boolean visible) {
    		if (word == null) {
    			word = new ActiveXComponent("Word.Application");
    			word.setProperty("Visible", new Variant(visible));
    		}
    		if (documents == null)
    			documents = word.getProperty("Documents").toDispatch();
    	}
    
    	/**
    	 * 设置退出时参数
    	 * 
    	 * @param saveOnExit
    	 *            boolean true-退出时保存文件,false-退出时不保存文件
    	 */
    	public void setSaveOnExit(boolean saveOnExit) {
    		this.saveOnExit = saveOnExit;
    	}
    
    	/**
    	 * 创建一个新的word文档
    	 * 
    	 */
    	public void createNewDocument() {
    		doc = Dispatch.call(documents, "Add").toDispatch();
    		selection = Dispatch.get(word, "Selection").toDispatch();
    	}
    
    	/**
    	 * 打开一个已存在的文档
    	 * 
    	 * @param docPath
    	 */
    	public void openDocument(String docPath) {
    		closeDocument();
    		doc = Dispatch.call(documents, "Open", docPath).toDispatch();
    		selection = Dispatch.get(word, "Selection").toDispatch();
    	}
    
    	/**
    	 * 把选定的内容或插入点向上移动
    	 * 
    	 * @param pos
    	 *            移动的距离
    	 */
    	public void moveUp(int pos) {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		for (int i = 0; i < pos; i++)
    			Dispatch.call(selection, "MoveUp");
    
    	}
    
    	/**
    	 * 把选定的内容或者插入点向下移动
    	 * 
    	 * @param pos
    	 *            移动的距离
    	 */
    	public void moveDown(int pos) {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		for (int i = 0; i < pos; i++)
    			Dispatch.call(selection, "MoveDown");
    	}
    
    	/**
    	 * 把选定的内容或者插入点向左移动
    	 * 
    	 * @param pos
    	 *            移动的距离
    	 */
    	public void moveLeft(int pos) {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		for (int i = 0; i < pos; i++) {
    			Dispatch.call(selection, "MoveLeft");
    		}
    	}
    
    	/**
    	 * 把选定的内容或者插入点向右移动
    	 * 
    	 * @param pos
    	 *            移动的距离
    	 */
    	public void moveRight(int pos) {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		for (int i = 0; i < pos; i++)
    			Dispatch.call(selection, "MoveRight");
    	}
    
    	/**
    	 * 把插入点移动到文件首位置
    	 * 
    	 */
    	public void moveStart() {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		Dispatch.call(selection, "HomeKey", new Variant(6));
    	}
    
    	public void moveEnd() {
    		if (selection == null)
    			selection = Dispatch.get(word, "Selection").toDispatch();
    		Dispatch.call(selection, "EndKey", new Variant(6));
    	}
    
    	/**
    	 * 从选定内容或插入点开始查找文本
    	 * 
    	 * @param toFindText
    	 *            要查找的文本
    	 * @return boolean true-查找到并选中该文本,false-未查找到文本
    	 */
    	public boolean find(String toFindText) {
    		if (toFindText == null || toFindText.equals(""))
    			return false;
    		// 从selection所在位置开始查询
    		Dispatch find = word.call(selection, "Find").toDispatch();
    
    		// 设置要查找的内容
    		Dispatch.put(find, "Text", toFindText);
    		// 向前查找
    		Dispatch.put(find, "Forward", "True");
    		// 设置格式
    		Dispatch.put(find, "Format", "True");
    		// 大小写匹配
    		Dispatch.put(find, "MatchCase", "True");
    		// 全字匹配
    		Dispatch.put(find, "MatchWholeWord", "True");
    		// 查找并选中
    		return Dispatch.call(find, "Execute").getBoolean();
    	}
    
    	/**
    	 * 把选定选定内容设定为替换文本
    	 * 
    	 * @param toFindText
    	 *            查找字符串
    	 * @param newText
    	 *            要替换的内容
    	 * @return
    	 */
    	public boolean replaceText(String toFindText, String newText) {
    		if (!find(toFindText))
    			return false;
    		Dispatch.put(selection, "Text", newText);
    		return true;
    	}
    
    	/**
    	 * 全局替换文本
    	 * 
    	 * @param toFindText
    	 *            查找字符串
    	 * @param newText
    	 *            要替换的内容
    	 */
    	public void replaceAllText(String toFindText, String newText) {
    		while (find(toFindText)) {
    			Dispatch.put(selection, "Text", newText);
    			Dispatch.call(selection, "MoveRight");
    		}
    	}
    
    	/**
    	 * 在当前插入点插入字符串
    	 * 
    	 * @param newText
    	 *            要插入的新字符串
    	 */
    	public void insertText(String newText) {
    		Dispatch.put(selection, "Text", newText);
    	}
    
    	/**
    	 * 
    	 * @param toFindText
    	 *            要查找的字符串
    	 * @param imagePath
    	 *            图片路径
    	 * @return
    	 */
    	public boolean replaceImage(String toFindText, String imagePath) {
    		if (!find(toFindText))
    			return false;
    		Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
    		return true;
    	}
    
    	/**
    	 * 全局替换图片
    	 * 
    	 * @param toFindText
    	 *            查找字符串
    	 * @param imagePath
    	 *            图片路径
    	 */
    	public void replaceAllImage(String toFindText, String imagePath) {
    		while (find(toFindText)) {
    			Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
    			Dispatch.call(selection, "MoveRight");
    		}
    	}
    
    	/**
    	 * 在当前插入点插入图片
    	 * 
    	 * @param imagePath
    	 *            图片路径
    	 */
    	public void insertImage(String imagePath) {
    		Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
    	}
    
    	/**
    	 * 合并单元格
    	 * 
    	 * @param tableIndex
    	 * @param fstCellRowIdx
    	 * @param fstCellColIdx
    	 * @param secCellRowIdx
    	 * @param secCellColIdx
    	 */
    	public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, int secCellRowIdx, int secCellColIdx) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		Dispatch fstCell = Dispatch.call(table, "Cell", new Variant(fstCellRowIdx), new Variant(fstCellColIdx))
    				.toDispatch();
    		Dispatch secCell = Dispatch.call(table, "Cell", new Variant(secCellRowIdx), new Variant(secCellColIdx))
    				.toDispatch();
    		Dispatch.call(fstCell, "Merge", secCell);
    	}
    
    	/**
    	 * 在指定的单元格里填写数据
    	 * 
    	 * @param tableIndex
    	 * @param cellRowIdx
    	 * @param cellColIdx
    	 * @param txt
    	 */
    	public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx, String txt) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
    		Dispatch.call(cell, "Select");
    		Dispatch.put(selection, "Text", txt);
    	}
    
    	/**
    	 * 在当前文档拷贝数据
    	 * 
    	 * @param pos
    	 */
    	public void copy(String toCopyText) {
    		moveStart();
    		if (this.find(toCopyText)) {
    			Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    			Dispatch.call(textRange, "Copy");
    		}
    	}
    
    	/**
    	 * 在当前文档粘帖剪贴板数据
    	 * 
    	 * @param pos
    	 */
    	public void paste(String pos) {
    		moveStart();
    		if (this.find(pos)) {
    			Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    			Dispatch.call(textRange, "Paste");
    		}
    	}
    
    	/**
    	 * 在当前文档指定的位置拷贝表格
    	 * 
    	 * @param pos
    	 *            当前文档指定的位置
    	 * @param tableIndex
    	 *            被拷贝的表格在word文档中所处的位置
    	 */
    	public void copyTable(String pos, int tableIndex) {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		Dispatch range = Dispatch.get(table, "Range").toDispatch();
    		Dispatch.call(range, "Copy");
    		if (this.find(pos)) {
    			Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    			Dispatch.call(textRange, "Paste");
    		}
    	}
    
    	/**
    	 * 在当前文档末尾拷贝来自另一个文档中的段落
    	 * 
    	 * @param anotherDocPath
    	 *            另一个文档的磁盘路径
    	 * @param tableIndex
    	 *            被拷贝的段落在另一格文档中的序号(从1开始)
    	 */
    	public void copyParagraphFromAnotherDoc(String anotherDocPath, int paragraphIndex) {
    		Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得当前文档的内容
    		Dispatch.call(wordContent, "InsertAfter", "$selection$"); // 插入特殊符定位插入点
    		copyParagraphFromAnotherDoc(anotherDocPath, paragraphIndex, "$selection$");
    	}
    
    	/**
    	 * 在当前文档指定的位置拷贝来自另一个文档中的段落
    	 * 
    	 * @param anotherDocPath
    	 *            另一个文档的磁盘路径
    	 * @param tableIndex
    	 *            被拷贝的段落在另一格文档中的序号(从1开始)
    	 * @param pos
    	 *            当前文档指定的位置
    	 */
    	public void copyParagraphFromAnotherDoc(String anotherDocPath, int paragraphIndex, String pos) {
    		Dispatch doc2 = null;
    		try {
    			doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
    			Dispatch paragraphs = Dispatch.get(doc2, "Paragraphs").toDispatch();
    
    			Dispatch paragraph = Dispatch.call(paragraphs, "Item", new Variant(paragraphIndex)).toDispatch();
    			Dispatch range = Dispatch.get(paragraph, "Range").toDispatch();
    			Dispatch.call(range, "Copy");
    			if (this.find(pos)) {
    				Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    				Dispatch.call(textRange, "Paste");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (doc2 != null) {
    				Dispatch.call(doc2, "Close", new Variant(saveOnExit));
    				doc2 = null;
    			}
    		}
    	}
    
    	/**
    	 * 在当前文档指定的位置拷贝来自另一个文档中的表格
    	 * 
    	 * @param anotherDocPath
    	 *            另一个文档的磁盘路径
    	 * @param tableIndex
    	 *            被拷贝的表格在另一格文档中的序号(从1开始)
    	 * @param pos
    	 *            当前文档指定的位置
    	 */
    	public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex, String pos) {
    		Dispatch doc2 = null;
    		try {
    			doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
    			Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch();
    			Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    			Dispatch range = Dispatch.get(table, "Range").toDispatch();
    			Dispatch.call(range, "Copy");
    			if (this.find(pos)) {
    				Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    				Dispatch.call(textRange, "Paste");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (doc2 != null) {
    				Dispatch.call(doc2, "Close", new Variant(saveOnExit));
    				doc2 = null;
    			}
    		}
    	}
    
    	/**
    	 * 在当前文档指定的位置拷贝来自另一个文档中的图片
    	 * 
    	 * @param anotherDocPath
    	 *            另一个文档的磁盘路径
    	 * @param shapeIndex
    	 *            被拷贝的图片在另一格文档中的位置
    	 * @param pos
    	 *            当前文档指定的位置
    	 */
    	public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex, String pos) {
    		Dispatch doc2 = null;
    		try {
    			doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
    			Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();
    			Dispatch shape = Dispatch.call(shapes, "Item", new Variant(shapeIndex)).toDispatch();
    			Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();
    			Dispatch.call(imageRange, "Copy");
    			if (this.find(pos)) {
    				Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
    				Dispatch.call(textRange, "Paste");
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (doc2 != null) {
    				Dispatch.call(doc2, "Close", new Variant(saveOnExit));
    				doc2 = null;
    			}
    		}
    	}
    
    	/**
    	 * 创建表格
    	 * 
    	 * @param pos
    	 *            位置
    	 * @param cols
    	 *            列数
    	 * @param rows
    	 *            行数
    	 */
    	public void createTable(int numCols, int numRows) { // (String pos, int
    														// numCols, int numRows)
    														// {
    		// if (!find(pos)) {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		Dispatch range = Dispatch.get(selection, "Range").toDispatch();
    		Dispatch newTable = Dispatch.call(tables, "Add", range, new Variant(numRows), new Variant(numCols))
    				.toDispatch();
    		Dispatch.call(selection, "MoveRight");
    		moveEnd();
    		// }
    	}
    
    	/**
    	 * 在指定行前面增加行
    	 * 
    	 * @param tableIndex
    	 *            word文件中的第N张表(从1开始)
    	 * @param rowIndex
    	 *            指定行的序号(从1开始)
    	 */
    	public void addTableRow(int tableIndex, int rowIndex) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    		Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex)).toDispatch();
    		Dispatch.call(rows, "Add", new Variant(row));
    	}
    
    	/**
    	 * 在第1行前增加一行
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addFirstTableRow(int tableIndex) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    		Dispatch row = Dispatch.get(rows, "First").toDispatch();
    		Dispatch.call(rows, "Add", new Variant(row));
    	}
    
    	/**
    	 * 在最后1行前增加一行
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addLastTableRow(int tableIndex) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    		Dispatch row = Dispatch.get(rows, "Last").toDispatch();
    		Dispatch.call(rows, "Add", new Variant(row));
    	}
    
    	/**
    	 * 增加一行
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addRow(int tableIndex) {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    		Dispatch.call(rows, "Add");
    	}
    
    	/**
    	 * 增加一列
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addCol(int tableIndex) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    		Dispatch.call(cols, "Add").toDispatch();
    		Dispatch.call(cols, "AutoFit");
    	}
    
    	/**
    	 * 在指定列前面增加表格的列
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 * @param colIndex
    	 *            指定列的序号 (从1开始)
    	 */
    	public void addTableCol(int tableIndex, int colIndex) {
    		// 所有表格
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    		System.out.println(Dispatch.get(cols, "Count"));
    		Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex)).toDispatch();
    		// Dispatch col = Dispatch.get(cols, "First").toDispatch();
    		Dispatch.call(cols, "Add", col).toDispatch();
    		Dispatch.call(cols, "AutoFit");
    	}
    
    	/**
    	 * 在第1列前增加一列
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addFirstTableCol(int tableIndex) {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    		Dispatch col = Dispatch.get(cols, "First").toDispatch();
    		Dispatch.call(cols, "Add", col).toDispatch();
    		Dispatch.call(cols, "AutoFit");
    	}
    
    	/**
    	 * 在最后一列前增加一列
    	 * 
    	 * @param tableIndex
    	 *            word文档中的第N张表(从1开始)
    	 */
    	public void addLastTableCol(int tableIndex) {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		// 要填充的表格
    		Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
    		// 表格的所有行
    		Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    		Dispatch col = Dispatch.get(cols, "Last").toDispatch();
    		Dispatch.call(cols, "Add", col).toDispatch();
    		Dispatch.call(cols, "AutoFit");
    	}
    
    	/**
    	 * 自动调整表格
    	 * 
    	 */
    	public void autoFitTable() {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		int count = Dispatch.get(tables, "Count").toInt();
    		for (int i = 0; i < count; i++) {
    			Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch();
    			Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    			Dispatch.call(cols, "AutoFit");
    		}
    	}
    
    	/**
    	 * 调用word里的宏以调整表格的宽度,其中宏保存在document下
    	 * 
    	 */
    	public void callWordMacro() {
    		Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    		int count = Dispatch.get(tables, "Count").toInt();
    		Variant vMacroName = new Variant("Normal.NewMacros.tableFit");
    		Variant vParam = new Variant("param1");
    		Variant para[] = new Variant[] { vMacroName };
    		for (int i = 0; i < para.length; i++) {
    			Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1)).toDispatch();
    			Dispatch.call(table, "Select");
    			Dispatch.call(word, "Run", "tableFitContent");
    		}
    	}
    
    	/**
    	 * 设置当前选定内容的字体
    	 * 
    	 * @param boldSize
    	 * @param italicSize
    	 * @param underLineSize
    	 *            下划线
    	 * @param colorSize
    	 *            字体颜色
    	 * @param size
    	 *            字体大小
    	 * @param name
    	 *            字体名称
    	 */
    	public void setFont(boolean bold, boolean italic, boolean underLine, String colorSize, String size, String name) {
    		Dispatch font = Dispatch.get(selection, "Font").toDispatch();
    		Dispatch.put(font, "Name", new Variant(name));
    		Dispatch.put(font, "Bold", new Variant(bold));
    		Dispatch.put(font, "Italic", new Variant(italic));
    		Dispatch.put(font, "Underline", new Variant(underLine));
    		Dispatch.put(font, "Color", colorSize);
    		Dispatch.put(font, "Size", size);
    	}
    
    	/**
    	 * 文件保存或另存为
    	 * 
    	 * @param savePath
    	 *            保存或另存为路径
    	 */
    	public void save(String savePath) {
    		Dispatch.call((Dispatch) Dispatch.call(word, "WordBasic").getDispatch(), "FileSaveAs", savePath);
    	}
    
    	/**
    	 * 关闭当前word文档
    	 * 
    	 */
    	public void closeDocument() {
    		if (doc != null) {
    			Dispatch.call(doc, "Save");
    			Dispatch.call(doc, "Close", new Variant(saveOnExit));
    			doc = null;
    		}
    	}
    
    	/**
    	 * 关闭全部应用
    	 * 
    	 */
    	public void close() {
    		closeDocument();
    		if (word != null) {
    			Dispatch.call(word, "Quit");
    			word = null;
    		}
    		selection = null;
    		documents = null;
    	}
    
    	/**
    	 * 打印当前word文档
    	 * 
    	 */
    	public void printFile() {
    		if (doc != null) {
    			Dispatch.call(doc, "PrintOut");
    		}
    	}
            /**
    	 * 插入word图表
             * 包含组合图表
             * t 图表类型
    	 * list 图表数据源
             * charttitletext 图表标题
    	 */
    	public void inLine(int t, List<Object[]> list, String chartTitleText) {
    		// List<Object[]> list=new ArrayList<Object[]>();
    		// Object[]
    		// o={"","广州电力设计院","广州汇隽电力工程设计有限公司","广州南方电力建设集团电力设计有限公司","广州市电力工程设计有限公司","广州新研电力设计有限公司"};
    		// Object[] o1={"前三季度平均值","68","139","84","124","42"};
    		// Object[] o2={"第四季度","163","247","13","363","66"};
    		// list.add(o);
    		// list.add(o1);
    		// list.add(o2);
    
    		// 插入ole对象
    		Dispatch inLine = Dispatch.get(selection, "InlineShapes").toDispatch();
    		Dispatch graph = Dispatch.call(inLine, "AddOLEObject", "MSGraph.Chart.8").toDispatch();
    		// 设置图表的高度
    		Dispatch.put(graph, "Height", new Variant(300.00));
    		// 设置表的宽度
    		Dispatch.put(graph, "Width", new Variant(400.00));
    		// 格式化图表
    		Dispatch oleFormat = Dispatch.call(graph, "OLEFormat").toDispatch();
    		Dispatch obj = Dispatch.call(oleFormat, "Object").toDispatch();
    		// 设置背景墙颜色
    		Dispatch walls = Dispatch.get(obj, "Walls").toDispatch();
    		Dispatch interiorWall = Dispatch.get(walls, "Interior").toDispatch();
    		Dispatch.put(interiorWall, "ColorIndex", new Variant(2));
    		// 设置图表区的外边框颜色和背景色
    		Dispatch chartArea = Dispatch.get(obj, "ChartArea").toDispatch();
    		Dispatch interior = Dispatch.get(chartArea, "Interior").toDispatch();
    		Dispatch.put(interior, "ColorIndex", new Variant(2));
    		Dispatch border = Dispatch.get(chartArea, "Border").toDispatch();
    		Dispatch.put(border, "ColorIndex", new Variant(1));
    		Dispatch.put(obj, "HasLegend", new Variant(false));
    		Dispatch.put(obj, "HasTitle", new Variant(true));
    		// 设置图形的类型
    		/*
    		 * 图形样式 可能的样式有:柱图代码为51,52,53,54,55,56;柱状图还含有堆积图 折线代码为65,66;
    		 * 饼图代码有70,-4102,5,69;等等)
    		 */
    		Dispatch.put(obj, "ChartType", 51);
    		Dispatch SeriesCollection = Dispatch.call(obj, "SeriesCollection", 2).toDispatch();
    		Dispatch.put(SeriesCollection, "ChartType", 4);
    
    		// 设置图形Y轴图形样式
    		Dispatch axes = Dispatch.call(obj, "Axes", 2).toDispatch();
    		Dispatch.put(axes, "HasMajorGridlines", true);// 设置图形的横向网络线是否显示
    		// 设置图形左侧坐标轴字体样式
    		Dispatch font_y = Dispatch.get(Dispatch.get(axes, "TickLabels").toDispatch(), "Font").toDispatch();
    		Dispatch.put(font_y, "Name", "宋体");
    		Dispatch.put(font_y, "Size", "9");
    		// 设置图标标题
    		Dispatch chartTitle = Dispatch.get(obj, "ChartTitle").toDispatch();
    		Dispatch.put(chartTitle, "Text", chartTitleText);
    		Dispatch font = Dispatch.get(chartTitle, "Font").toDispatch();
    		Dispatch.put(font, "Size", "18");
    		Dispatch.put(font, "Name", "黑体");
    		Dispatch dataSheet = Dispatch.get(obj, "Application").toDispatch();
    		Dispatch dataSheet2 = Dispatch.get(dataSheet, "dataSheet").toDispatch();
    
    		// 显示图形的数据表
    		Dispatch.put(obj, "HasDataTable", true);
    		Dispatch dataTable = Dispatch.get(obj, "DataTable").toDispatch();
    		// 设置是否显示数据表的标识(这里设置为显示数据表的标识)
    		Dispatch.put(dataTable, "ShowLegendKey", true);
    		// 获得数据表对象的字体属性,并设置字体和字号等
    		Dispatch fontTable = Dispatch.get(dataTable, "Font").toDispatch();
    		Dispatch.put(fontTable, "Name", "宋体");
    		Dispatch.put(fontTable, "Size", "9");
    
    		// 得到数据表的单元格
    		Dispatch cells = Dispatch.get(dataSheet2, "Cells").toDispatch();
    		Dispatch.call(cells, "Clear");
    		// for循环添加数据
    		for (int i = 0; i < list.size(); i++) {
    			Object[] o11 = list.get(i);
    
    			for (int j = 0; j < o11.length; j++) {
    				Dispatch item = Dispatch.call(cells, "Item", new Variant(i + 1), new Variant(j + 1)).toDispatch();
    				Dispatch.put(item, "value", o11[j]);
    			}
    
    		}
    		Dispatch.call(graph, "Select"); // 选中图表
    		// Dispatch.put(fullSeriesCollection, "ChartType", 4);
    		Dispatch ShapeRange = Dispatch.call(graph, "ConvertToShape").toDispatch(); // 取得图片区域
    		Dispatch WrapFormat = Dispatch.get(ShapeRange, "WrapFormat").toDispatch(); // 取得图片的格式对象
    		// 设置环绕格式(0 - 7)下面是参数说明
    		// wdWrapInline 7 将形状嵌入到文字中。
    		// wdWrapNone 3 将形状放在文字前面。请参阅 wdWrapFront 。
    		// wdWrapSquare 0 使文字环绕形状。行在形状的另一侧延续。
    		// wdWrapThrough 2 使文字环绕形状。
    		// wdWrapTight 1 使文字紧密地环绕形状。
    		// wdWrapTopBottom 4 将文字放在形状的上方和下方。
    		// wdWrapBehind 5 将形状放在文字后面。
    		// wdWrapFront 6 将形状放在文字前面。
    		Dispatch.put(WrapFormat, "Type", 1);
    
    	}
    
    	public static void main(String args[]) throws Exception {
    		//
    		// WordTest msWordManager = new WordTest(true);
    		// msWordManager.createNewDocument();
    		//
    		// String latex = "$$\\sqrt {{a^2} + {b^2}} *3$$";
    		//
    		// msWordManager.insertText(latex);
    		//
    		// msWordManager.moveEnd();
    		//
    		// msWordManager.close();
    
    	}
    
    }

     

    更多相关内容
  • 第三章:Tableau绘图1 认识Tableau2 数据连接2.1 Excel CSV 和PDF数据2.1.1 连接Excel数据源2.1.2 连接文本文件数据源2.1.3 连接PDF数据源2.2 数据库连接3 维度与度量4 绘制条形图5 绘制堆叠图5.1 垂直堆叠条状图5.2...


    手动反爬虫,禁止转载: 原博地址 https://blog.csdn.net/lys_828/article/details/120088185(CSDN博主:Be_melting)

     知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息
    

    1 认识Tableau

    Tableau 是基于斯坦福大学突破性交互式技术,它帮助我们生动地分析实际存在任何结构化数据,以在短时间内生成美观的图表、坐标图、仪表盘与报告

    Tableau 将数据运算与美观的图表完美地嫁接在一起,利用它简便的拖放式界面,可以自定义视图、布局、形状、颜色等等,帮助展现自己的数据视角

    它的程序很容易上手,可以用它将大量数据拖放到数字“画布”上,转眼间就能创建好各种图表;界面上的数据越容易操控,对业务领的所作所为到底是正确还是错误,就能了解得更加透彻

    课程提供两种版本,个人版(Tableau Public)和专业版(Tableau Desktop),其中专业版默认14天的使用权,需要购买;个人版可获得90%功能使用已足够满足日常需求。网盘地址提取码:6666

    专业版和个人版软件安装是双击安装包,一直next按照向导操作即可,默认安装

    2 数据连接

    2.1 Excel CSV 和PDF数据

    Tableau支持50多种数据源,根据不同的软件版本提供不同的数据源

    在Public这个免费版本中,Excel CSV和 PDF 都是受支持的版本;学习过程中,我们使用 Public 版本进行教学

    首先打开个人版软件界面如下。初始界面分为三个部分,左侧的就是选择连接数据源;中间就是已经存在的分析文件,可以直接点击打开,进行操作后保存的文件都会在这里显示;最右边的就是使用介绍和软件相关资讯
    请添加图片描述

    2.1.1 连接Excel数据源

    点击左侧的连接到Microsoft Excel,会跳出一个弹窗,供选择加载的Excel数据,此时选择Sample-Superstore.xls数据文件,加载文件后界面如下
    请添加图片描述
    加载完后数据后,界面中左上方连接下方显示的是当前选择的Excel文件,工作表下方是当前Excel文件中的表单sheet,可以发现一共有三个,可以将任意表单拖到右侧的示意处,表单中的数据就会显示在右下方。默认显示的数据是1000条,可以通过下拉滚轮查看;数据上方会有数据类型的标记,#代表数字类型,Abc代表字符串,日历标记代表时间类型;数据表头上方还可以进行数据字段的筛选与排序
    请添加图片描述
    如果想要加载多张sheet表单时候可以直接拖到右上方,不需要加载的表单数据可以从左上方拖出去就好

    2.1.2 连接文本文件数据源

    点击左上方菜单栏文件下面的星型图案,会跳转到软件打开后的界面,选择连接区域的第二项文本文件(包含了txt,csv,tab,tsv等格式),就可以再弹出的窗口中选择对应的数据格式类型,比如导入fifa18_clean.csv数据文件,导入结果如下。导入文本文件后的内容和Excel内容有一个地方存在差异,就是Excel中可以存放多个sheet表单,下面红框中对应的就是选择文件中的多个sheet表单,但是文本文件中就只有一份数据,下面红框中显示的就是当前csv文件路径地址下可供选择的文本文件数据源。其余部分的内容显示完全一致
    请添加图片描述

    2.1.3 连接PDF数据源

    首先要求PDF文件不是图片转化,而是直接有word生成的,可以选中里面的表格数据,否则是解析不了PDF里面的表格数据内容。如下,通过鼠标拖动可以选择表格中的数据。
    请添加图片描述
    回到软件打开首页后,点击连接到PDF文件,跳出弹窗中选择Water Physical Stock Account_ 1995-2010.pdf后确认,会跳出选择提取数据的设置,可以勾选提取全部内容,也可以是指定范围甚至单页。这里作为演示操作,比如提取上面第14页的内容,鼠标勾选单个页面,输入要提取页面的编号,这里就是第14页,输入14后点击确认按钮
    请添加图片描述
    软件会自动解析PDF文档,并进行数据的提取,解析结果如下。当前文档会解析出三个文件,第一个文件就是全部的表格数据,但是存在着前三列没有完全提取完全,第二个文件就是提取的部分数据,第三个文件也是部分数据。综合来看对于PDF文件数据提取,并不是一定能够将所有的数据都按照原格式进行提取,而且会存在大量的空值
    请添加图片描述

    2.2 数据库连接

    以MySQL数据库连接为例,进行操作示例。需要注意个人版Tableau并不支持MySQL数据库连接,需要使用专业版软件。专业软件的开始界面会多很多的连接资源选项,要连接MySQL资源可以点击到服务器下面的MySQL或者更多里面的MySQL,第一次启动连接时候需要下载驱动,按照弹窗的提示点击下载按钮后跳转到MySQL官网

    请添加图片描述
    跳转到下载驱动的页面,会提醒下载安装的步骤,第一步转到MySQL网站,其中黄色的字体部分是超链接直接点击后跳转
    请添加图片描述
    跳转页面后根据自己的操作系统进行选择,选择完成后点击下方ZIP压缩包形式下载
    请添加图片描述
    此时跳转到最后一个下载提示界面,需要留意一行小字,点击后就可以进行下载了
    请添加图片描述
    下载完毕后直接双击,程序会自动进行安装,一直默认设置后下一项,就可以安装完成
    请添加图片描述
    然后退出当前的专业版Tableau软件,重新登录后选择连接到MySQL资源,会弹出连接数据库的选项,需要用户进行输入要连接数据库的信息和账号密码。前两个如果是在本地基本上就是不用修改,第三个选择要连接的那一个数据库名称,剩下就是用户名和密码。各项输入完毕后点击Sign In按钮
    请添加图片描述
    等待几秒种自动连接到MySQL数据库,数据库中的各个表会出现在左侧,任意拖动一个到右上方的表数据显示区,表中的数据就在右下方呈现,结果如下
    请添加图片描述

    3 维度与度量

    维度:通常是分类字段,如名称、地区、邮寄方式等

    • 将其拖放到功能区时,Tableau 不会对其进行运算,而是对视图区进行分区,维度的内容显示为各区的标题
    • 字符串、日期时间变量默认设为维度
    • 数据桶:连续型数据离散化后默认设为维度

    度量:通常是数值字段,如销售额、利润、折扣等

    • 将其拖放到功能区时,Tableau 默认会进行聚合运算,连续字段的取值会显示为视图中的连续轴
    • 数值变量默认设为度量
    • 度量值:相应度量的具体汇总数值,一般和度量名称联合使用
    • 记录数:符合筛选条件的计数
    • 度量名称:所有度量变量的集合

    4 绘制条形图

    加载Sample-Superstore.xls文件数据,然后将orders表单的数据添加到右侧的数据窗口(除了直接拖动外,还可以鼠标双击),然后点击下方的转到工作表,软件界面会跳转到工作窗口。
    请添加图片描述
    对于条状图的绘制有两种方式:

    • 将绘制的x轴对应维度(拖到列),y轴对应度量(拖到行)
    • 直接使用智能推荐,选择条状图后再用鼠标选择维度和度量

    跳转到工作界面后,条状图制作方式如下。标号①就是将维度和度量分别拖到列和行的位置,图形就自动出来了,或者按照标号②,点击智能推荐后,会提示选择维度和度量,此时鼠标再点击左侧要绘制的维度和度量即可。软件菜单栏下面的快捷操作按钮可以进行快速操作,比如标注的四个,分别将纵向条状图转化为横向条状图,升序,降序和调整图形布局
    请添加图片描述
    还可以对绘制后的图形进行标记,比如添加数值标记,将度量直接拖到标记中的标签处,各条状图的顶端就会显示出对应的数值
    请添加图片描述
    此外还可以继续丰富图表的内容,比如添加标题和摘要,操作方式就是在标记选项卡下面的空白位置点击鼠标右键进行选择。标题(T)是图像上方的位置,标题(A)是图像下方的位置,摘要是在图形的右侧
    请添加图片描述
    维度可以进行任意改变,比如将region拖出来,换一个维度拖到列的位置,此时搭配着快捷功能按钮(x-y轴转换,降序,扩充整个视图),就可以将图像绘制成如下样式
    请添加图片描述

    5 绘制堆叠图

    5.1 垂直堆叠条状图

    在基础条状图上进行延伸,可以绘制水平堆叠图和垂直堆叠图。首先绘制出垂直堆叠图,还是两种方式,介绍第一种方式通过选择维度和度量后进行拖动。还是基于最初绘制的条状图,将Category维度拖动刀标记选项卡中的颜色上,图形就会按照Category进行堆叠,而且会在图形的右侧自动显示对应颜色的图例
    请添加图片描述
    点击图例中的某一颜色,图形中会自动进行相对应的变化,比如直接点击红色,图形中会把红色的各部分进行突出显示,其它颜色变成灰色。而且鼠标点击的同时可以有两个选择,一个就是只保留选择的红色,另个就是把红色排除掉
    请添加图片描述
    第二种方式绘制就是直接通过智能推荐进行。在左侧同时选中如下三个字段(Ctrl按住后分别点击即是同时多选),此时右侧的智能推荐第三行就全部由灰色变亮,点击中间的垂直堆叠条状图就会在中间的绘图区域出现想要的图型,如果要加数值标签,将Sales度量拖到标记选项卡中的标签上即可
    请添加图片描述

    5.2 水平堆叠条状图

    有了前面绘制的基础,水平水平堆叠条状图就很简单了,第一种方式也就是最简单的方式,通过智能推荐,选择第三行中的第三个图形,绘图区的图形就显示如下(按住ctrl a就会全选中图形,此时图像的边缘线就会显示出来)
    请添加图片描述
    第二种就是拖动维度或者度量的方式,可以对比列和行后对应的内容,水平堆叠条状图的列方向上需要两个维度,行方向上有一个度量。需要特别留意的是:两个维度的前后顺序会影响绘制图像
    请添加图片描述
    此外对于堆叠图,无论是水平还是垂直方向,堆叠的类型不应该过多(一般认为是7种),否则绘制的图形就会很不美观,而且图形解释起来也很困难,比如将子分类Sub-Category维度添加到堆叠分类中,图形中的色彩较多,会产生一种杂乱无章的感觉。
    请添加图片描述
    当然也不是说颜色多就不可以使用堆叠条状图。既然颜色太多,那么就可以想办法把颜色变少,就用到了前面介绍的选择右侧的颜色,关于颜色保留和排除的功能,比如选择绿色设置为只保留,就会单独的把绿色挑出来(也可以尝试一下选择删除的选项)。需要留意页面中筛选器的部分就会多出来刚刚的筛选条件
    请添加图片描述
    当然也不是只能选择同一种颜色,甚至可以选择不同Region下的不同颜色,比如只选择Central,East,South下的粉红,绿,蓝,绘制结果如下(通过按住Ctrl键进行多选)
    请添加图片描述

    5.3 文件保存

    点击快捷功能按钮可以进行文件保存,个人版和专业版这时候的功能会出现不同的差异,个人版需要将工作簿进行命名后保存到网络端,且中间还受限制与网络,有时网络波动会导致长时间没反应等待的现象
    请添加图片描述
    如果网络稳定,加载正常,点击保存后,就会弹出网络端的界面,需要刷新加载半分钟到一分钟界面才会显现出来。注意下面的页面是网页(加载渲染需要时间),使用时候会要求进行邮箱注册登录,不过里面有免费的10G的使用空间,足以放置常绘制的文件
    请添加图片描述
    个人版无法将文件保存在本地计算机上,如果是专业版的软件,可以有两种保存形式,一种是twb,另一种是twbx。两者的区别在于,前者后缀不加x的文件格式是不包含数据内容,每次打开之后需要重新加载数据(方便自己本机操作修改完善),二后者是文件中已经将数据包含在里面了,用户打开后不需要再加载数据,适合进行协作演示,发送给汇报人后,直接打开就有结果呈现(方便传阅展示)
    请添加图片描述
    对于个人版软件,也可以在网络端进行下载,操作结果如下,最终下载到本地的文件格式为twbx,如果文件保密,可以下载后将网络端文件删除即可,这样就实现了个人版软件保存twbx文件的操作(但是这个过程最艰难的就是经过两次网络请求,可能速度受限甚至会刷新不出来)
    请添加图片描述

    6 绘制饼图

    6.1 基本图形绘制

    前面介绍了绘制条形图的两种方式,实际操作时常用的方式是第二种,就是直接使用智能推荐进行绘制,先确定要绘制的图形类别,然后选择字段(维度和度量)即可,如果饼图的位置和大小不合适,可以通过③③步操作进行调整。比如绘制不同区域的销售占比,首先选择饼图类型,然后按住Ctrl键选择Region维度和Sales度量
    请添加图片描述

    6.2 添加标签和标注

    有了饼图的基础样子,进一步就是完善标签和标注信息,比如添加每份的标签数据和对应的销售额,直接将这两个字段拖到标记选项卡中的标签上面,输出如下
    请添加图片描述
    如果要显示百分比样式,可以调整度量Sales对应的标签信息,默认是按照总和进行显示,鼠标放置该标记上,最后面会自动出现有个倒三角符号,点击这个倒三角符号后,选择快速表计算,将汇总换成合计百分比,确认完成后中间的标记就出现了百分比
    请添加图片描述

    6.3 标注格式设置

    如果想进一步设置标注的格式,比如小数点保留的位数,显示的位置等,可以在中间绘图区域点击鼠标右键弹出窗口选择设置格式,左侧会出现设置选项卡,里面包含了全局信息,Region信息,Sales信息的格式设置,由于要设置的Sales中的百分比显示,点击该选项卡右上侧的字段下拉选项,将字段切换至总和(Sales)的总计%
    请添加图片描述
    然后在默认值区,将数字栏通过下拉选项选择百分比,并设置保留小数点为0,也就是取整,操作及输出结果如下
    请添加图片描述
    如果需要同时显示销售额的总和数值标记,关闭设置格式选项卡,再将Sales度量拖到标签中即可,这样就完成了饼图的绘制。如果要进行部分标签之间的对比,可以对选定颜色的只保留(筛选器功能)选择红色和蓝色,就能实现南部和中部销售额占比的对比分析
    请添加图片描述

    6.4 多饼图绘制

    前面进行饼图的绘制,可以发现行和列是没有进行指定,如果将纬度信息拖到行和列上,就实现了多饼图的绘制,比如探究不同子分类下的不同快递方式的销售额情况,就可以将Category和Ship Mode维度拖到列和行上,由于图形较多,可以根据情况设置标注的信息,比如这里只显示标签和占比信息,这样就能知道每个区域中不同类别产品的不同快递方式的占比情况
    请添加图片描述
    如果进一步有需求进行单区域数据显示,或者部分区域的对比分析,就可以使用筛选器功能,点击部分颜色只保留即可。如下是对West地区和Central地区进行对比分析
    请添加图片描述

    7 绘制树图

    7.1 基本图形绘制

    树图,英文名称为Tree Map。是饼图的变种。在实际操作绘制饼图的过程中,当分类标签信息较多时候(超过7类)饼图就很难进行美观展示数据,而且数据解释性变差,此时就可以考虑将图形变成树图(饼图中通过扇形大小表示占比的多少,树图中通过矩形的面积表示占比的多少),比如通过按住Ctrl键选中Sub-Category维度和Sales度量,此时智能推荐中树图变亮,点击后中间绘图区就自动出现想要的树图
    请添加图片描述

    7.2 颜色渐变与起止范围

    树图中除了矩形的大小表示占比外,本身就自带有一个渐变的颜色,可以通过颜色的分类,查看不同类别的占比情况。比如将Profit度量拖到标记选项卡中的颜色上,生成绘制图像后可以将右侧的颜色条拖动至标记选项卡下边,这样可以更大范围的显示图形
    请添加图片描述
    颜色条选项卡双击后就会进入编辑窗口,可以更加详细的设置颜色的起止范围和渐变效果等。通过下拉色板栏,选择不同的色系,勾选渐变颜色指定渐变的分段数,高级选项中可以指定起止和中点信息数值。比如下面的颜色条说明产品越挣钱颜色越蓝,亏损越多颜色越黄
    请添加图片描述

    7.3 二级分类树图

    在基础树图的基础上还可以进行二级分类的设置,也就是在矩形中再套矩形的设置。比如探究不同区域中不同子品牌的销售占比情况,先以Region维度和Sales度量绘制树图,然后将Sub-Category拖到颜色上绘制下图。需要留意一点:上面绘制颜色条属于连续数值(可以根据数值取到任意颜色),这里的颜色是按照Sub-Category进行分类,只有17种颜色,属于离散数值
    请添加图片描述
    生成的图形中不仅将颜色都划分好,而且还有每一个颜色中的左上角的矩阵块就是代表该类型销售额最高的地区,比如子分类最大褐色的手机部分,第一个左上角的区域显示就是East区域销量最好,其次分别为West,Central和South区域

    8 绘制气泡图

    气泡图也是属于饼图的延伸,当分类数量超多20种时,即便是树图也没有办法很好的呈现效果,这里就需要使用到气泡图。Ctrl按住点选Sub-Category维度和Sales度量后打开右侧的智能推荐,选择绘制填充气泡图,操作及输出结果如下,也是两步
    请添加图片描述
    当分类数据类型超过50种时,此时气泡图就可以发挥它优势,比如将产品名称和销售额进行绘制气泡图。产品名称分类共有1850种,通过气泡图直接就可以看出最突出的部分,而且由于是交互式,鼠标放置上面就会显示产品的详细信息
    请添加图片描述
    注意到气泡图是有颜色的,因此就可以添加一个分类维度,这个维度的分类一般不要超过4个,比如按照不同地区进行分类,直接再将Region维度拖到标记选项卡的颜色上,绘图区中生成图像如下(通过鼠标点击就可以知道产品名称和所处区域以及销售数额)
    请添加图片描述

    9 绘制词云图

    词云图的功能和气泡图的功能类似,但是表现形式上不同。词云图是对文本数据字体的大小来反映出该类型所占的比重,颜色也可以分类,但是需要注意一点:智能推荐中并没有直接绘制词云图的选项,需要先绘制一个基础图形,比如条状图或者饼图,然后在标记选项卡中的下拉栏中选择文本,就会在中间的绘图区显示词云图
    请添加图片描述
    将Profit度量拖到标记选项卡中的颜色上,就可以对各种类型产品的盈利情况进行分析(很明显可以看出Tables,Bookcases和Supplies出现了明显地销售亏损,Phones,Chairs和Accessories等盈利较多)
    请添加图片描述

    10 绘制表格

    10.1 基本表格绘制

    绘制的方式有除了有绘制图形的两种方式外,还有第三种方式。接下来就一一介绍三种方式,最常用的就是直接使用智能推荐,直接选中维度和度量后选择智能推荐中的第一个图形,操作如下
    请添加图片描述
    第二种操作方式,按照上面图形中的显示,将维度直接拖到行,然后度量拖到标记选项卡中的文本上,输出结果如下
    请添加图片描述
    第三种方式,将维度拖到行,将度量拖到图中显示的Abc区域,此时会显示右侧的智能推荐,只有一个表格呈现亮色,然后自动将度量数据添加到Abc这一列
    请添加图片描述

    10.2 复杂表格

    第一种就是分类表格,比如按照地区Region和商品子分类Sub-Category进行统计汇总,求均值,销售数量等。先绘制统计汇后的表格,直接将Sub-Category维度拖到行,Region维度拖到列,Sales度量拖到标记选项卡中的标签中或者拖到中间表格的Abc区域中(前者在绘制图形时介绍很多了,这里使用后者)
    请添加图片描述
    将Sales度量拖到中间的Abc区域后,松开鼠标,就会自动统计汇总的结果显示数值,如下
    请添加图片描述
    如果还要显示均值,销售数量等信息,需要留意一点,每次默认添加的数据都是以统计汇总的结果,所以为了保证后续加入的Sales度量不被覆盖,第一次再度量加入后设置不同的统计信息,比如第一次设置平均值,操作如下
    请添加图片描述
    然后再拖入Sales度量,导入后设置计数(销售数量)和汇总统计结果, 最终结果如下
    请添加图片描述
    如果希望三种统计结果不是以单个单元格进行显示,而是分散在三个单元格以每一列进行显示。操作步骤如下

    • 将Sub-Category维度拖到行
    • 将Sales度量拖到中间Abc中,设置为平均值统计
    • 将Sales度量拖到中间Abc中,设置为计数(不同)统计
    • 将Sales度量拖到中间Abc中,设置为汇总统计
    • 将Region维度拖到列

    最终生成的表格如下,具体的步骤顺序图像上也进行了标注
    请添加图片描述

    10.3 度量值与度量名称

    可以发现突然多了度量名称和度量值以及筛选器,如果将列中的度量名称和Region调换位置,生成图表如下(此时就是按照不同区域不同子商品类型进行多标签统计表的绘制)
    请添加图片描述
    关于度量值,如果在Abc区域传入的多个度量,那么超过两个时候自动在出现度量值和度量名称以及筛选器。仔细观察左侧的表,细心点就可以发现是存在度量名称和度量值,这两个是方便进行绘制表格,比如还是将Sub-Category拖动到行,然后度量名称拖到列,度量值拖到中间Abc区域
    请添加图片描述
    此时筛选器中没有内容,如果把度量值中任意去除一项,筛选器中就会出现度量名称,双击这个度量名称就会弹出筛选设置窗口,根据需要选择要添加的度量即可
    请添加图片描述
    如果直接把度量名称放在列,度量值放在行,绘制出的结果就是直接对所有的度量进行汇总统计,并生成条状图(Discount度量的汇总统计值较小,但不是没有数据,只是对边显着条状的矩形不见了)
    请添加图片描述
    度量值和度量名称的经典应用,就是指定某一维度时,分析该维度和所有度量之间的关系,特别是当度量值个数较多时候,使用度量值和度量名称就越简单。比如探究Region维度下的各度量的汇总统计,如果还是向Abc区域中一个个拖动度量,这里有5个度量就需要拖动5次,但是使用度量值和度量名称,就只需要鼠标拖动两次,将度量名称拖到换行,再将度量值拖到标签上或者Abc区域
    请添加图片描述

    11 绘制折线图

    11.1 基本图形绘制

    折线图的绘制也有两种方式,还是倾向使用智能推荐的方式,按住Ctrl键点选Order Date维度和Sales度量,此时智能推荐中折线图变亮,选择第四排第一个图形,绘制如下
    请添加图片描述
    也可以进行颜色分类,比如拖动Region维度到颜色标签上,结果就会按照Region中的分类类别进行绘制
    请添加图片描述

    11.2 绘制双轴折线图

    将Order Date维度拖到列,Sales和Profits度量拖到行,输出结果就是同x轴双y轴,但是这个y轴和平常见的不一致
    请添加图片描述
    可以采用两种方式进行同步y轴,第一种是在y轴的左侧区域,点击鼠标右键后,再跳出的选项中点击双轴
    请添加图片描述
    第二种方式就是不直接将其中的一个度量拖到行后面,而是直接拖到图形的最右端,如下
    请添加图片描述
    两种方式生成的图形都是下面的样式。通过分析同x双y轴的折线图可以对比两个度量之间的关联性,比如这里的图形解析,在2016-2017年虽然销售额下降,但是利润是增长态势,过了2016年后,随着销售额的增长,利润也在同步增长
    请添加图片描述

    11.3 连续与离散折线图绘制

    通过智能推荐绘制折线图,第四行第一个图形属于连续折线图,第二个图形数据离散折线图,两者之间的样式,直接绘制是一样的图形,但是要留意行后面的Order Date维度的颜色,连续折线下该维度显示绿色,离散折线下该维度显示蓝色
    请添加图片描述
    两者之间的区别可以通过点击年(Order Date)前面的+号绘制图形进行区别。连续折线图数据点之间的连线是不会断,而离散折线图是会断,连续折线图往往是查看趋势,离散折线图往往是对比不同时期内的度量变化
    请添加图片描述
    连续和离散并不是绝对的,离散是可以向连续转化,连续也可以转化为连续。比如将Category拖到行和列上,此时显示的都是蓝色代表着离散数据类型
    请添加图片描述
    可以点击任意一个Category后面的下拉三角,选择度量中的计数或者计数(不同)等选项
    请添加图片描述
    鼠标点击后,列后面的Category就变绿色成为了连续数据,输出图形如下(由此就可以实现离散到连续的转化)
    请添加图片描述

    12 绘制复合图形

    12.1 绘制棒棒糖图形

    棒棒糖图就是条状图+圆的结合,将同一个度量拖到行后两次,此时就构成了同x双y轴图像,注意原来的标记选项卡就多了内容,每部分控制的内容不同,比如要将下面的图形由条状图变成散点图,只需要将标记中最后一个总和(Sales)下的自动调整到圆
    请添加图片描述
    然后再同步双轴,调整第一个总和(Sales)下的内容,首先将自动调整为条状图,接着设置条状图的大小(要小于散点的大小),输出图像如下。也可以结合最初介绍的排序和添加标签或者格式的设置根据需要再进行微调
    请添加图片描述

    12.2 条状折线图

    顾名思义这种复合图形是由柱状图和折线图组合而成,绘制时候先绘制两个折线或者两个条状图都可以,比如先绘制两个连续折线图,然后再将第二个显示形状调整为条状图。为了x轴多显示出一些标签可以连续点击Order Date两下,取月份(默认是年,只有四年,标签数量较少),最终输出的图形如下
    请添加图片描述
    此时选择同步双轴,如果出现了条状图遮挡住了折线图,可以调整①处的顺序,对于x轴标签的信息显示可能过长,可以在x轴标签区域右键鼠标选择格式设置调整对齐方向,调整为向上,见下②过程
    请添加图片描述
    之前通过词云图探究了不同子商品的销售额和利润的情况,这里可以使用双轴图来对比,操作方式和上面基本一致,只不过将折线图换成了散点图,最后再按照利润进行排序,输出结果如下(通过这种方式的对比,可以很清晰地发现亏损的类别产品)
    请添加图片描述
    除了这种同x双y轴图样式外,还可以设置两个条状图。这种需要修改两个条状图的相对大小,使得两者之间可以有明显的错开感
    请添加图片描述

    12.3 自定义形状棒棒糖

    除了顶端是圆形外,还可以指定自定义形状,此时第二个总和(Sales)下拉框中选择形状,这时候该选项卡中就多了一个形状卡片,点击后会弹出各种默认形状供选择,也可以点击更多形状,出现一个大的编辑形状的窗口,在选择形状板中挑一个自己喜欢的形状后应用,比如这里挑一个小虫子,输出结果中顶端的圆就变成了小虫子
    请添加图片描述

    13 计算字段和判断条件

    13.1 计算字段创建

    计算字段的创建有两种方式,第一种是在软件的顶部菜单栏,点击分析选项,弹出的选项框中选择创建计算字段;或者直接点击左侧第一个部分的右上方的倒三角,选择第一个创建计算字段,如下
    请添加图片描述
    比如对维度中具体分类名称进行全部大写的转换,使用到两种创建方式,分别记为upper1和upper2,框内输入UPPER([Sub-Category])后点击确定,可以修改计算字段的名称如下
    请添加图片描述
    然后左侧表中多出来了两个维度(就是刚刚创建的upper1和upper2字段),将其拖入到同一行中,可以发现这两个计算字段的应用结果是一致的
    请添加图片描述
    如果要创建汇总的计算字段,比如求总和,平均等。手动创建两个字段如下
    请添加图片描述
    还是以Sub-Category维度作为列,然后依次将创建的两个统计计算字段拖到Abc区域中,并直接对比Sales度量拖到Abc区域中的汇总与平均值的结果。可以发现使用创建的统计计算字段求解的结果和直接使用软件提供的功能求解的结果是一致的
    请添加图片描述

    13.2 创建判断条件

    这种情况就是在创建的条件字段中添加判断语句,比如还是以Sub-Category维度作为列,Profit度量作为行,自动绘制条状图如下
    请添加图片描述
    如果想要按照利润值是否大于0进行颜色分类,就可以创建一个计算字段,添加判断条件如下
    请添加图片描述
    然后把生成的计算字段拖到标记选项卡中的颜色上,图形就会按照利润值是否大于0分为两类
    请添加图片描述
    同样也可以将结果应用在表格上,此时点击右上方的智能推荐,选择第一个进行表格绘制,中间的绘图区就自动变成了数据表格,配合着排序功能按钮就可以实现降序的排列
    请添加图片描述

    13.3 多自定义形状棒棒糖图形

    前面绘制了自定义形状棒棒图,但是使用的形状只有一种,如果结合着判断条件就可以使用多种了。首先绘制后棒棒糖图,然后将创建的计算字段Status of Profit拖到标记选项卡中的形状上,接着在选择形状板中下拉选择一个自己喜欢的形状后,指定真伪对应的形状,比如这里对利润大于0进行结果分类,真就是利润为正显示为绿色上升箭头,伪就是利润为负显示为红色下降箭头
    请添加图片描述

    14 绘制地图

    首先将经度(自动生成)和纬度(自动生成)两个度量分别拖到列和行,然后双击State维度和Country维度,输出结果如下
    请添加图片描述
    此时拖动Status of Profit计算字段到标记选项卡中的颜色上,State维度拖到标记选项卡中的标签上,自动生成的图形如下
    请添加图片描述
    如果想要自定义形状也可以将标记选项卡中下拉栏选择形状,然后把Status of Profit计算字段拖到形状上,接着自定义真伪对应的形状即可,输出图形如下
    请添加图片描述
    地图也可以进行双轴图绘制,将维度(自动生成)度量再拖一次到行中,然后调整两个地图中的显示样式,上面一个地图样式设置为自动,然后将Sales度量拖到颜色上,下面一个地图样式设置为形状,然后将Status of Profit计算字段拖到形状卡片上,接着选择自定义真伪的形状,比如这里选择小虫子代表利润亏损,灯泡代表利润增长,最后点击行中维度(自动生成)度量后的倒三角,弹出的选项中选择双轴
    请添加图片描述
    自动生成图形如下,此外还可以将Profit度量拖到标记选项卡中的大小上,用来反映利润的多少。这个图形中包含了大量的信息,首先底层各州的颜色代表着销售额,蓝色越深代表着销售业绩越好,形状中的小甲虫代表着地区利润亏损,小甲虫越大亏损越多,灯泡代表着盈利,灯泡越大盈利越多
    请添加图片描述

    15 绘制烟囱图

    烟囱图绘制需要三个要求,首先某一度量拖到行上,将某一维度拖到标记选项卡中的颜色上,同一度量再拖到标记选项卡中的大小上,比如探究不同部门下的销售额。补充知识点:通过按住Ctrl + ←/Ctrl + →调整中间烟囱图的胖瘦,Ctrl + ↑/Ctrl + ↓调整中间烟囱图的高低
    请添加图片描述
    结合之前学习过的知识,可以为图形添加标签和数值占比信息以及格式的设置,可以自行尝试动手调整

    除了基本烟囱图外,还可以有另一种烟囱图,是利用区域面积进行绘制。首先将某一维度拖到行,某一度量拖两次到列,然后在标记选项卡中将自动切换为区域,生成的图像如下
    请添加图片描述
    这时距离烟囱图还差一个图形的旋转,可以鼠标右键点击下方任意一个图形x轴标签区域,弹出的选项中选择第一个编辑轴后跳转的界面中勾选倒序,烟囱图就绘制完成了
    请添加图片描述
    这时候任意替换维度,就可以生成不同维度的销售额烟囱图,比如换成Sub-Category维度
    请添加图片描述

    16 绘制日历图

    绘制日历图,就要知道日历应该是怎么构成的。上方应该是周日到周六一周七天,下方应该是日期每个月对应的1-30号。操作步骤如下:

    • 将Order Date维度拖到列中,点击此维度后面的倒三角,自定义选择为工作日,默认显示日期部分
    • 将Order Date维度拖到行中,点击此维度后面的倒三角,自定义选择为周数,默认显示日期部分
    • 将Order Date维度拖到筛选器中,筛选方式为年月,任意勾选一个月份
    • 将Order Date维度拖到标记选项卡中的本文上,点击此文本标记后面的倒三角,显示天

    按照上面的步骤顺序生成的图形如下。日历图的背景轮廓就显示出来了,接着就把要展示的度量拖到标记选项卡中的颜色上即可
    请添加图片描述
    比如把利润Profit度量拖到颜色上进行展示,标记选项卡中的下拉栏选择方形,然后可以调整一下标签对齐的位置,让其显示在方形的正中间,输出结果如下
    请添加图片描述
    除了方形也可以指定其它的样式,比如圆形,自定义形状等,颜色也可以自定义指定,有需要的话可以将筛选器打开放置在图形右侧,如下(红色代表盈利,绿色代表亏损,右侧的筛选器直接勾选就可以切换时间显示)
    请添加图片描述

    17 绘制哑铃图

    哑铃图用于对比不同时间段的度量情况,形状类型哑铃,操作步骤如下:

    • 将Sub-Category维度拖到行中
    • 将Sales度量拖到列中两次,双轴显示
    • 将Order Date维度拖到筛选器,按年选择,以2016和2018年为例
    • 将Order Date维度拖到第一个图形的标记选项卡中的颜色上,区别2016和2018年

    按照上面的操作步骤,输出图形如下。欲对比的两年的数据以不同的颜色显示在图形上了,但是缺少中间连接的“哑铃杆”
    请添加图片描述
    此时将第二个图像标记选项卡中的下拉栏选择为路径,将Order Date维度拖到路径卡片上,输出结果如下。这里有个需要注意的地方:Order Date维度有两次拖到标记选项卡中,分别是添加颜色分类和“哑铃杆”,第一次是拖到上面总和Sales标记选项卡中,第二次是拖到下面总和Sales标记选项卡中(如果没有留意这一点,图形效果出不来)
    请添加图片描述

    18 绘制甜甜圈图

    甜甜圈图就是空心饼图(圆环图)。想要在Tableau中绘制空心饼图,实际上需要绘制两个饼图,然后双轴合并,缩小一个饼图把它变成白色就行了

    首先在行后面创建两个计算字段,直接通过双击输入min(1)回车后名称自动变成聚合(min(1)),此时将标记选项卡中的下拉栏中的自动调整为饼图(中间的图形就有条状图变成饼图),然后放大至整个视图
    请添加图片描述
    此时设置双轴显示,然后将Category维度拖到第一个聚合(min(1))标记卡的颜色上,然后调整两个饼图的大小,第一个值调的大一些,第二个稍微小一些,感觉相对大小适合后再将第二个饼图的颜色调整为浅色(比如白色),输出图形如下
    请添加图片描述
    进一步完善甜甜圈图的信息,添加标签信息和数值,将Category维度拖到第一个饼图的标签上,然后将Sales度量分别拖到第一个和第二个饼图的标签上,输出结果如下
    请添加图片描述
    需要留意一点,这里的圆环的三个颜色的分类是等大小的,并不是将Category维度拖到颜色上就会自动进行配比,具体占比的变化是需要将度量拖到到标记选项卡中的角度上,比如再将Sales度量拖到角度上。如果要显示的是百分比,可以参照前面饼图的绘制(针对不同的字段进行格式设置,比如最外层的饼图标签设置的是百分位保留两个小数格式,内部饼图标签显示的自动格式)。注意对比上图各颜色区域的大小占比(很明显的一点是红色和蓝色最低端不是在一个水平线上,证明两者的占比变化了),最终输出图形如下
    请添加图片描述
    此外还可以进行多甜甜圈图的绘制,只需要将维度拖到列或者行中即可,比如拖到一个Region维度到列,一个Ship Mode维度到行,输出结果如下(当显示的图形较多时候,标签信息可以适当减少,由于每种颜色在左下角已经有图例显示名称了,可以去掉这个标签信息,然后再调整甜甜圈图的大小)
    请添加图片描述
    如果有点强迫症的小朋友们,不想看到min(1)显示出来,可以在左侧的min(1)所在的区域,鼠标右键取消显示标题的勾选,左右两侧的min(1)都消失了,如果要想取消最上面工作表1的内容也是同样的操作,最终输出的图形如下
    请添加图片描述

    19 绘制热力图

    绘制一个简单的热力图。将Region维度拖到列,Sub-Category维度拖到行,然后将Sales度量拖到标记选项卡中的大小上,调整图形的大小,输出结果如下
    请添加图片描述
    除了自动的样式外,也可以调整标记选项卡中的下拉栏,比如转化为自定义形状,使用小甲虫进行标记,输出结果如下
    请添加图片描述
    热力图的绘制也可以结合这判断条件进行颜色分类,比如创建一个Status of Profit计算字段,代码框中的内容如下
    请添加图片描述
    然后将该计算字段拖到形状上,选择真伪对应的形状,比如还是按照盈利显示灯泡,亏损显示小甲虫,输出结果如下
    请添加图片描述
    除此之外,同时可以将判断条件的结果进行详细的指定,比如使用盈利和亏损来代替真伪,需要修改计算字段,代码框中的内容修改如下
    请添加图片描述
    然后点击确定,调整一下排序,输出图形如下,留意右侧图例的名称已经发生变化了
    请添加图片描述

    20 绘制帕累托图

    帕累托图属于常见的统计图表,该图的特征就是x轴维度(对应列),左y轴对应频数(这里就是销售额),需要从大到小排列,右侧对应频率累计百分比,最终值为100%。首先将Sub-Category维度拖到列,由于是双轴图,将Sales度量拖两次到列上,然后设置双轴显示,第一个标记选项卡中的总和(Sales)下拉栏选择条形图,第二个选择折线图,初步绘制图形如下
    请添加图片描述
    接着将顺序按照从大到小排列,再点击行中的第二个总和(Sales)后的倒三角,选择添加表计算
    请添加图片描述
    在弹出的设置窗口中将计算类型改为汇总,接着勾选下方的辅助计算,然后在从属计算类型中选择合计百分比,操作示意如下
    请添加图片描述
    最后进行图表内容的丰富,比如两个图形的颜色单独设置,还有标签信息格式,输出结果如下(标签格式设置中折线图上的累计百分比数值的添加也是使用的编辑表功能)
    请添加图片描述

    21 绘制子弹图

    子弹图(也称靶心图)用来比较两组信息,其中一组作为标准,另一组用来显示是否实现目标,或与目标间的差异。首先创建两个计算字段,提取2016年和2018年的销售数据
    请添加图片描述
    接着按住Ctrl键,同时选中Sub-Category维度,2016 Sales和2018 Sales两个度量,此时智能推荐里面最后一行图形中的靶心图会变亮,然后将图像扩大到整个视图,输出结果如下
    请添加图片描述
    注意智能推荐中绘制靶心图时候下面有一行灰色的小字,具体的使用方式就是在连续字段所在的轴以右键单击的方式会弹出选项,选择交换参考线,点击后可以发现左侧的度量和列上面的度量更换了位置,图像中的黑色参考线也发生了变化,操作输出如下
    请添加图片描述
    靶心图图形内容解读:

    • 深色段:前60%数据所处的位置
    • 浅色段:前80%数据所处的位置
    • 黑色线:100%数据所处的位置
    • 深蓝色柱形:2018年的数据

    可以看到,大部分的销售额都是2018年大于2016年。为了搞清楚具体的情况,我们再设计一个T/F条件字段命名为Sales Target,用不用颜色区别出2018年利润大于2016年利润的类别
    请添加图片描述
    将创建的这个字段拖到标记选项卡中的颜色上,输出结果如下
    请添加图片描述
    如果要自定义参考线以及阴影对应的参考值,可以在连续轴区域点击鼠标右键选择编辑参考线,在值的选项栏中可以输出两个数值以逗号分隔,比如75,90,输入后点击确认,原来的参考值就发生了变化,图像也就对应发生了变化
    请添加图片描述
    修改阴影参考值后为75,90后,可以明显的发现灰色的阴影部分更加靠近黑色参考线,如下
    请添加图片描述

    22 快速表计算

    这里介绍一下表格的一些快速操作,将Sub-Category维度拖到行,然后将Sales拖到中间的Abc区域,可以尝试使用一下快速表计算中的功能,如下
    请添加图片描述
    汇总就是直接拖动后的默认结果,其它的选项还有差异(下一行数据减去上一行数据),合计百分比,排序,百分位等都是比较好用的功能,此外还可以配合着数据下钻功能绘制时间报表,操作步骤如下

    • 将Order Date维度拖到行
    • 将Sales拖到表格中的的Abc区域
    • 点击行上的Order Date前面年的+,下钻到季度
    • 然后再点击季度前面的+,下钻到月
    • 将行上的年Order Date,调到列上

    执行上述操作后,输出结果如下(有兴趣可以尝试其它的快速表计算的功能)
    请添加图片描述
    比如使用合并百分比的快速表计算功能,同时配合着顶部菜单栏分析下面的合计,显示列和列合计,输出结果如下(也可以添加合计功能中的小计,会对每个季节进行统计汇总),这里最后的行总和计算的是该列的均值
    请添加图片描述
    除了总和进行列取均值外,也可以进行总和按照行取均值,操作就是点击左侧总和Sales后的倒三角,在计算依据中选择表(向下)
    请添加图片描述
    还有一种就是按照最终的总值进行汇总(分区汇总),也就是不按照行也不按照列,操作就是点击左侧总和Sales后的倒三角,在计算依据中选择区
    请添加图片描述
    还可以用排序,看每年销售额横向对比(2019年的销售额基本位列第一第二,通过这种方式比看销售排序要比具体数字更加直观)
    请添加图片描述
    还有针对两个维度进行分组统计,直接将要分组的两个维度拖到行,度量拖到中间的Abc区域,行中的维度的前后顺序决定了分组的顺序
    请添加图片描述
    不同时期的销售额同比与环比的分析,比如探究每年各季度每月份相较于前一年的销售额的增长情况,此时快速表计算就选择差异
    请添加图片描述
    在计算差异时对比的标准默认选择前一(这里就是前一年),也可以指定计算标准为相对第一(也就是按照第一年2016年)进行差异计算,输出结果如下(有需求也可以按照相较最后一个进行计算)
    请添加图片描述

    23 绘制凹凸图

    凹凸图就是使用双轴图进行同比环比的分析。绘制过程首先将Order Date维度拖到列上,Sales度量拖到行上,Region拖到标记选项卡中的颜色上,然后点击Sales度量后的倒三角选择快速表计算中的排序,输出结果如下
    请添加图片描述
    再次点击Sales度量后的倒三角,将计算依据换为Region,接着将行中的Sales度量按住Ctrl键拖到行中(相当于复制一份,形成双轴),然后再按住Ctrl拖到标记选项卡中的标签上,输出结果如下
    请添加图片描述
    最后一步就是同步轴,修改其中一个图形的样式为圆即可(点击标签卡片,可以设置标签位置,比如居中就是如下效果)
    请添加图片描述

    24 绘制百分比堆叠条状图

    这个图形也是常用的统计图,同样可以分析同比和环比,比如常用来探究各类产品的随着时间销售市场的变更趋势。绘制步骤首先是将Sub-Category维度拖到列,Sales度量拖到行,指定快速表计算方式为合计百分比,计算依据为单元格,然后再把Region维度拖到标记选项卡中的颜色上,最后按住Ctrl键,将行中的Sales度量拖到标记选项卡中标签上,绘制图形如下
    请添加图片描述

    25 绘制国内地图

    前面介绍美国地图的绘制,这里就加载国内的数据进行绘制地图,首先需要准备一份国内的地理数据china_sample.xlsx,数据中包含了编号,省市自治区以及粉丝数量,加载到Tableau软件中,然后转到工作簿中,点击Name维度后的倒三角,选择地理角色中的州/省/市/自治区,此时Name维度就有字符串数据类型转化为地理数据类型
    请添加图片描述
    接着直接双击Name维度后稍等一会直接加载出地图数据,以及标记圆点,此时将粉丝数度量拖到标记选项卡中的大小和标签上,输出结果如
    请添加图片描述
    Tableau支持数据下钻功能,对于地图数据,可以支持到市/区,但是前提是要加载对应的数据文件city.xlsx,然后该文件中字段分别为市/区编码,市/区名称和市/区所在省份/直辖市。将全国地理数据和市/区地理数据文件都加载都Tableau软件中(先加载一份数据后,左侧上方有一个添加选项,点击后再加载另一份数据),然后将两个Excel中的表单都拖到右上方的表单区,此时会跳出连接设置,指定city表中的Province Code和china表中的Code为连接依据,操作如下
    请添加图片描述

    进入工作簿中,将china下面的Name维度转化为州/省/市/自治区地理数据,city下面的Name维度转化为郡县,然后点击china下的Name维度,再打开右上方的智能推荐,绘制第二行第二个地图样式图形,接着把Name(china)维度拖到标记选项卡中的颜色和标签上,china下的粉丝数度量拖到标签上,输出的图形如下
    请添加图片描述
    接下来就进行数据下钻,比如选取省市下面的市/区,可以直接将city下面的Name添加到筛选器和标记选项卡中的详细信息及标签上,然后进行市/区筛选,及添加销量标签,输出结果如下
    请添加图片描述
    如果要直接显示一个省市下面的所有的市/区,直接将Name(china)拖到筛选器中,比如选择浙江省,然后再把city下面的Name维度拖到标记选项卡中的详细信息,标签和颜色上,Sales度量拖到标签上,输出结果如下
    请添加图片描述
    可以设置显示筛选器,然后右侧就可以按照自己的需要选择对应的省市自治区,如果要显示全国的信息,直接把筛选器拿掉即可,但是一般不会这么搞,因为到了地理二级图形就会变得很密集,一般是直到省市自治区不到市/区。

    展开全文
  • 使用Word文档的时候,我们也经常会往文档中插入图表,因为图表是以图形的形式显示数字,非常的直观,使用它可以更方便地分析或比较数据,具体怎么在Word2003中插入图表呢?就让Word联盟小编为大家带来分享! 动画...
    Word 2003是微软公司提供的一款文字处理软件,可以对文字进行 排版 和编辑、分段等各种处理,最终将编辑好的内容打印出来,是办公室一族中必备的办公软件之一。使用Word文档的时候,我们也经常会往文档中插入图表,因为图表是以图形的形式显示数字,非常的直观,使用它可以更方便地分析或比较数据,具体怎么在Word2003中插入图表呢?就让Word联盟小编为大家带来分享!

    动画演示:

    在Word中插入Excel图表

    一、创建图表

    (一) 直接创建图表

    ①单击菜单栏中的“插入”→“图片”→“图表”,将打开“数据表”窗口,同时在文档中插入一个示例图表。

    ②根据你所需要在数据表窗口中添加、修改数据,图表将随之改变。

    ③在文档其它位置单击,“数据表”窗口将隐藏(或关闭“数据表”窗口后在文档其它位置单击),图表以图片的形式嵌入文档中。

    (二) 利用表格创建图表

    ①在Word中创建表格,将文本标签置于首行和最左边的一列,在其它单元格中填入数字。

    ②选定要创建图表的表格区域。

    ③单击菜单栏中的“插入”→“图片”→“图表”,打开“数据表”窗口,同时文档中插入一个反映该数据区域的图表。

    ④在文档其它位置单击,图表以图片的形式嵌入文档中。

    提示:  还有一种方法创建图表:单击菜单栏中的“插入”→“对象”,在“新建”选项卡“对象类型”框中,选择“Microsoft Graph图表”,然后单击“确定”按钮。

    二、编辑图表

    要对图表的元素进行改动,必须在图表视图中进行。如果图表为图片形式,可双击之,其周围将出现斜线边框,此时就可以对图表进行编辑了。

    ①编辑数据

    如果“数据表”窗口没有显示,可单击“视图”→“数据工作表”(或单击右键,选择“数据工作表”)将其重新打开。在“数据表”窗口中对数据的改动将即时反映在图表中。

    ②设置对象格式

    在图表上选中不同的对象,如图表区、图例、背景墙、坐标轴等,单击鼠标右键,选择“设置×××格式”(也可以使用格式菜单的相应命令),在随后打开的对话框中可以设置选中对象的格式。

    ③改变图表类型

    在图表区的空白位置单击鼠标右键,选择“图表类型”,在弹出的“图表类型”对话框中,在“标准类型”选项卡中的“图表类型”框中选择一种新类型,最后单击“确定”。

    ④设置图表选项

    在图表区的空白位置单击鼠标右键,选择“图表选项”,在打开的对话框中可根据你所需要,分别对标题、坐标轴、网格线、图例、数据标志等进行设置。

    ⑤调整图表大小

    用鼠标拖动图表区的框线可改变图表的整体大小。同样单击选中图例区、标题区、绘图区等后,也可以改变它们的大小。

    此外,还可以使用快捷菜单对图表的三维视图格式进行设置。http://www.wdashi.com/exceltopdf
    展开全文
  • 将某一区域的值映射到另一区域,其大小关系不变。 这被称之为比例尺 比例尺分为两种: 线性比例尺 序数比例尺 (我的D3版本是v4的,这里v3在更新到v4之后,方法变动了很多,d3官方将方法进行了规范,本文中的比例...

    比例尺

    将某一区域的值映射到另一区域,其大小关系不变。
    这被称之为比例尺
    比例尺分为两种:

    • 线性比例尺
    • 序数比例尺

    (我的D3版本是v4的,这里v3在更新到v4之后,方法变动了很多,d3官方将方法进行了规范,本文中的比例尺就被规范了,v3,v4版本在比例尺方法上使用就不一样)

    线性比例尺

    var dataset_1 = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
        var dataset_2 = [ 2500, 2100, 1700, 1300, 900 ];
    
        var dataset = [20,85,10,15,39,46];
    
        var min = d3.min(dataset);
        var max = d3.max(dataset);
        
        //新库中不使用d3.scale.linear()了,
        //而是用 d3.scaleLinear()来代替。
        //把所有的d3.scale.linear()换成d3.scaleLinear()就可以出结果了。
        var linear = d3.scaleLinear()
                             .domain([min, max])
                             .range([0, 300]);
            linear(0.9); //return 0
            linear(2.3); //return 175
            linear(3.3); //return 300
    

    在这里插入图片描述
    这里能看到,0.9被映射成了0,3.3 被映射成了300

    序数比例尺

        var index = [0, 1, 2, 3, 4];
        var word = ["A", "B", "C", "D", "E"];
    
        //新库中不使用d3.scale.ordinal()了,
        //而是用 d3.scaleOrdinal()来代替。
        //把所有的d3.scale.ordinal()换成d3.scaleOrdinal()就可以出结果了。
        var ordinal = d3.scaleOrdinal().domain(index).range(word);
        ordinal(0);
        ordinal(2);
        ordinal(4);
    

    序数比例尺是将元素以下标的方式进行映射
    在这里插入图片描述

    代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>The Sixth</title>
    </head>
    <script src="../../../JS/d3.min.js"></script>
    
    <body>
        <!-- 给柱形图添加比例尺 -->
    	<script>
        
        var dataset = [20,85,10,15,39,46];
    
        var linear = d3.scaleLinear()
                .domain([0, d3.max(dataset)])
                .range([0, 250]);
        
        var width = 300;
        var height = 300;
    
        var svg = d3.select("body")//选择页面中的body元素
              .append("svg")//添加一个svg元素
              .attr("width",width)//设定宽度
              .attr("height",height);//设定高度
        
        var rectHeight = 25;   //每个矩形所占的像素高度(包括空白)
    
        svg.selectAll("rect")
            .data(dataset)
            .enter()
            .append("rect")
            .attr("x",20)
            .attr("y",function(d,i){
                return i * rectHeight;
            }).attr("width",function(d){
                return linear(d);   //在这里用比例尺
            }).attr("height",rectHeight-2)
              .attr("fill","steelblue");  
        </script>
    
    </body>
    </html>
    

    在这里插入图片描述
    此时的图表就有些样子了,下一篇加上坐标轴一张简单的图表就完成了

    展开全文
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • (全文共计1485字,预计阅读时间为4分钟)导读:经典回顾:【强烈推荐】2天让你学会撰写影像组学SCI论文#内含福利#科研论文插图/数据处理和图表制作学习会2019年12月27-29日上海26号报到现场赠送8G优盘和高清视频...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 数据分析和做科普是类似的,科普的意义在于将晦涩难懂的科学知识,以让大众更易接受和理解的方式呈现。而数据分析中的数据可视化做的正是如此关键中的关键,即是将数据的特点以一种显而易见的形式进行...
  • 中文版Excel.2007图表宝典 1/2

    热门讨论 2012-04-06 18:49:24
    4.10 处理图表数据表/118 4.10.1 添加和删除数据表/119 4.10.2 数据表的问题和限制/119 4.11设置三维图表格式/120 4.11.1 旋转三维图表/121 4.11.2 设置曲面图格式/122 第5章 趋势线和误差线的使用/123 5.1 趋势线...
  • 中文版Excel.2007图表宝典 2/2

    热门讨论 2012-04-06 19:01:36
    4.10 处理图表数据表/118 4.10.1 添加和删除数据表/119 4.10.2 数据表的问题和限制/119 4.11设置三维图表格式/120 4.11.1 旋转三维图表/121 4.11.2 设置曲面图格式/122 第5章 趋势线和误差线的使用/123 5.1 趋势线...
  • 用python对excel进行图表操作

    千次阅读 2022-02-21 15:43:55
    本文代码及数据集来自《超简单:用Python让Excel飞起来(实战150例)》 # 制作柱形图(方法一) import matplotlib.pyplot as plt plt.figure(figsize=(10, 4)) # 创建一个绘图窗口 x = ['1月', '2月', '3月', '4月...
  • 线上学习 建群答疑 会后回放课程特色这两部课程自开班以来受到往期学员100%高评,实用价值特别大。授课老师来自一线的同背景的科研人员,非常了解学员的实际需求。...对实验数据的分析、数据图形的绘制、生物统...
  • 经典Office 2003专升本复习题(Word、Excel、PowerPoint) 一、Word 2003 1. 启动 Word 是指: 将 Word 从硬盘中调入主存执行 2. 菜单栏: 文件( F )、编辑( E )、视图( V )、插入( I )、格式( O )、...
  • excel转word后表格显示不全

    千次阅读 2021-01-14 04:48:56
    excel转word后表格显示不全Excel插入word中,这样保存的全面的数据又能看到文字,领导比较喜欢看,那么有时excel显示不全是怎么回事呢?方法/步骤1、对于出现插入表格是这个形式的情况我们就要利用段落的间距来条整...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • 13.2.1 编写代码来处理任意大小数据区域 292 13.2.2 使用超级变量(super-variable):对象变量 293 13.2.3 在引用对象时使用With和End With 294 13.2.4 续行 294 13.2.5 在代码中添加注释 294 13.3 针对...
  • After my article “How To Make Microsoft Word Documents with PHP” (using Interop capability under Windows), there were quite a few comments urging a pure PHP implementation, i.e., only using a ...
  • Excel多张表格数据自动汇总到一张表上方法?如何将excel多张数据汇总在一个表中分为以下几步:1、工作簿中有多张工作表,A列和B列都有类似的数据,行数不同。2、选中“汇总”表A1单元格,点击【数据】-【合并计算】...
  • 可视化图表入门教程

    2019-07-23 17:36:43
    数据可视化,即通过图表形式展现数据,帮助我们快速、准确理解信息。好的可视化会“讲故事”,能向我们揭示数据背后的规律。 本文主要介绍常见图表的信息表达特征和适用场景,帮助大家了解如何在不同的场景下选择...
  • 1、即时取消Word的后台打印:当我们刚刚编辑完一篇文档按了打印命令后,后来又不想打印当前的文档了,那么怎样才能即时取消后台打印任务呢?一般来说,大家在发出打印任务后,程序会自动将打印任务设置为后台打印,...
  • 要怎样在Word的表格中增加一列Word表格中:将光标定位在表格最后一行右端(表格外)的回车符处,按回车键即在表格最后增加一行。事实上,在表格的任何位置处增加一行,只要将光标定位在该行表格外的回车符处,按回车键...
  • word里目录怎么做才方便呢?有没有文字最佳排版格式??Word里面的目录做起来很方便呀,做成自动生成的就好了呀。成目录等功能的前提是正确使用“样式”,工具栏最左边的小方框注意了吗,平时是“正文”,下拉箭头有...
  • 线上学习班建群答疑可以回放 终生免费复听一对一个性化服务本公司还推出一对一个性化服务,主要包括1)矢量流程图绘制(流程图、机制图、封面图、论文摘要图)2)图片类数据处理(色差调整、图片规整、图片修复)3)数值类...
  • 数据可视化,即通过图表形式展现数据,帮助我们快速、准确理解信息。好的可视化会“讲故事”,能向我们揭示数据背后的规律。 本文主要介绍常见图表的信息表达特征和适用场景,帮助大家了解如何在不同的场景下选择...
  • 3.在弹出的窗口区域框选预先准备好的分析内容。4.右击饼状图,选择添加数据标签。5.这样就解决了excel如何做图的数据分析的问题了。在Excel中绘制的圆饼图,怎么在圆饼图的分块中再进行细分?1、举一个商...
  • 1、,计算机应用基础,第4单元Word2010文字处理软件的应用,中等职业教育规划教材,任务1创建一个Word文档,目录,第4单元,任务2Word文档格式设置,任务4Word表格操作,任务3Word文档页面设置,任务5Word图文混排,任务1创建一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,526
精华内容 1,410
关键字:

word调整图表数据区域大小