主要是包括了对word和excel的操作。借鉴了网上的代码,做了很多修改。大家可以直接使用,欢迎添加新功能发布出来,方便其他人使用。 package MyJacob; import java.util.*; import java.util.regex.*; import java.io.*; public class OprOffice { // 采用正则,将每一行中匹配的内容以及行号保存到map中。 public static TreeMap<Integer, String> GetResult(String filename, String matcher) throws IOException { TreeMap<Integer, String> result = new TreeMap<Integer, String>(); BufferedReader in = new BufferedReader(new FileReader(filename)); String str; int linenum = 1; Pattern p = Pattern.compile(matcher); while ((str = in.readLine()) != null) { Matcher m = p.matcher(str); while (m.find()) { result.put(linenum, m.group()); } linenum++; } return result; } // 将map中的数据写入到word的表中去。 public static void insertWordTable(TreeMap<Integer, String> output, String ofilename) throws Exception { WordService myword = new WordService(true); myword.openDocument(ofilename); myword.insertTable("", output); myword.close(); } // 读取excel中指定的列的数据 public static ArrayList<String> GetValueByColumn(String xlsName, String column, int startline, int linecount) throws Exception { ExcelService myexcel = new ExcelService(false); myexcel.openDocument(xlsName); ArrayList<String> result = myexcel.GetValuesByColumn(column, startline, linecount); myexcel.close(); return result; } } package MyJacob; import java.io.File; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComFailException; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordService { /** * 读取Com接口异常的最多重试次数. */ private static final int MAX_RETRY = 10; /** * word文档. */ private Dispatch document = null; /** * word运行程序对象. */ private ActiveXComponent wordApp = null; /** * 选定的范围或插入点. */ private Dispatch selection; /** * 退出时是否保存文档. */ private boolean saveOnExit = true; private static boolean; //在我自己的笔记本上不用这么处理也可以保存,但是在公司电脑上就不行了。 /** * 构造函数. * @param show 是否可见. */ public WordService(final boolean show) { if (wordApp == null) { wordApp = new ActiveXComponent("Word.Application"); wordApp.setProperty("Visible", new Variant(show)); } } /** * 设置退出时参数. * @param b boolean true-退出时保存文件,false-退出时不保存文件 */ public void setSaveOnExit( final boolean b) { this.saveOnExit = b; } /** * 把选定的内容或插入点向上移动. * @param pos 移动的距离 */ public void moveUp( final int pos) { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } for (int i = 0; i < pos; i++) { Dispatch.call(selection, "MoveUp"); } } /** * 把选定的内容或者插入点向下移动. * @param pos 移动的距离 */ public void moveDown( final int pos) { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } for (int i = 0; i < pos; i++) { Dispatch.call(selection, "MoveDown"); } } /** * 把选定的内容或者插入点向左移动. * @param pos 移动的距离 */ public void moveLeft( final int pos) { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } for (int i = 0; i < pos; i++) { Dispatch.call(selection, "MoveLeft"); } } /** * 把选定的内容或者插入点向右移动. * @param pos 移动的距离 */ public void moveRight( final int pos) { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } for (int i = 0; i < pos; i++) { Dispatch.call(selection, "MoveRight"); } } /** * 把插入点移动到文件首位置. */ public void moveStart() { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } Dispatch.call(selection, "HomeKey", new Variant(6)); } /** * 把插入点移动到文件尾位置. */ public void moveEnd() { if (selection == null) { selection = Dispatch.get(wordApp, "Selection").toDispatch(); } Dispatch.call(selection, "EndKey", new Variant(6)); } /** * 增加缩进. * @param pos 缩进量 */ public void listIndent( final int pos) { Dispatch range = Dispatch.get(this.selection, "Range").toDispatch(); Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch(); for (int i = 0; i < pos; i++) { Dispatch.call(listFormat, "ListIndent"); } } /** * 减少缩进. * @param pos 缩进量 */ public void listOutdent( final int pos) { Dispatch range = Dispatch.get(this.selection, "Range").toDispatch(); Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch(); for (int i = 0; i < pos; i++) { Dispatch.call(listFormat, "ListOutdent"); } } /** * 回车换行. */ public void enter() { int index = 1; while (true) { try { Dispatch.call(this.selection, "TypeParagraph"); break; } catch (ComFailException e) { if (index++ >= MAX_RETRY) { throw e; } else { continue; } } } } /** * 插入一个换页符. */ public void insertPageBreak() { Dispatch.call(this.selection, "InsertBreak", new Variant(2)); } /** * 设置word文档是否可见. * @param isVisible 是否可见 */ public void setIsVisible( final boolean isVisible) { wordApp.setProperty("Visible", new Variant(isVisible)); } /** * 判断文档是否存在. * @param docName 文档名称. * @return boolean 是否存在. */ private boolean isExist( final String docName) { boolean result = false; File file = new File(docName); result = file.exists(); file = null; return result; } /** * 获取文件名称. * @param docName 文档路径. * @return 文件名称 */ public String getFileName( final String docName) { int pos = docName.lastIndexOf("//"); return docName.substring(pos + 1); } /** * 打开文档. * @param docName 文档路径. * @throws Exception 异常 */ public void openDocument( final String docName) throws Exception { Dispatch docs = wordApp.getProperty("Documents").toDispatch(); if (isExist(docName)) { this.closeDocument(); document = Dispatch.invoke(docs,"Open",Dispatch.Method, new Object[] { docName, new Variant(false),new Variant(readonly) },// 是否以只读方式打开 new int[1]).toDispatch(); } else { wordApp.invoke("Quit", new Variant[] {}); throw new Exception("[Open doc failed]: file[" + docName + "] isn't existed!"); } selection = Dispatch.get(wordApp, "Selection").toDispatch(); } /** * 添加一个新文档. * @throws Exception 异常 */ public void CreateNewDocument(final String docName) throws Exception { try { Dispatch docs = wordApp.getProperty("Documents").toDispatch(); document = Dispatch.invoke(docs,"Add",Dispatch.Method, new Object[] { docName, new Variant(false),new Variant(readonly) },// 是否以只读方式打开 new int[1]).toDispatch(); selection = Dispatch.get(wordApp, "Selection").toDispatch(); } catch (com.jacob.com.ComFailException cfe) { throw new Exception(cfe.getMessage()); } catch (com.jacob.com.ComException ce) { throw new Exception(ce.getMessage()); } } /** * 插入一段文字. * @param textToInsert 文字 * @param style 样式 */ public void insertText( final String textToInsert, final String style) { Dispatch.put(selection, "Text", textToInsert); Dispatch.put(selection, "Style", getOutlineStyle(style)); Dispatch.call(selection, "MoveRight"); } /** * 插入一段文字. * @param textToInsert 文字 */ public void insertText( final String textToInsert) { Dispatch.put(selection, "Text", textToInsert); Dispatch.call(selection, "MoveRight"); } /** * 插入一个图片. * @param imagePath 图片路径. * @param style 图片样式 */ public void insertImage( final String imagePath, final String style) { Dispatch.call(Dispatch.get(selection, "InLineShapes") .toDispatch(), "AddPicture", imagePath); Dispatch.call(selection, "MoveRight"); Dispatch.put(selection, "Style", getOutlineStyle(style)); this.enter(); } /** * 插入一个图片. * @param imagePath 图片路径. */ public void insertImage( final String imagePath) { Dispatch.call(Dispatch.get(selection, "InLineShapes") .toDispatch(), "AddPicture", imagePath); Dispatch.call(selection, "MoveRight"); this.enter(); } /** * 获取对应名称的Style对象. * @param style Style名称. * @return Style对象 */ public Variant getOutlineStyle( final String style) { int index = 1; while (true) { try { return Dispatch.call( Dispatch.get(this.document, "Styles").toDispatch(), "Item", new Variant(style)); } catch (ComFailException e) { if (index++ >= MAX_RETRY) { throw e; } else { continue; } } } } /** * 插入标题. * @param text 标题文字. * @param style 设置标题的类型 */ public void insertOutline( final String text, final String style) { this.insertText(text, style); this.enter(); } /** * 插入标题. * @param text 标题文字. */ public void insertOutline( final String text) { this.insertText(text); this.enter(); } /** * 插入目录. * tablesOfContents的参数的含义 Add(Range As Range, [UseHeadingStyles], * [UpperHeadingLevel], [LowerHeadingLevel], [UseFields], [TableID], * --这两个要不要都可以 [RightAlignPageNumbers],[IncludePageNumbers], [AddedStyles], * --这个参数必须有值,必须是数字,如果是其它,则报com.jacob.com.ComFailException * [UseHyperlinks],[HidePageNumbersInWeb], [UseOutlineLevels]) */ public void insertTablesOfContents() { Dispatch tablesOfContents = Dispatch.get(this.document, "TablesOfContents") .toDispatch(); Dispatch range = Dispatch.get(this.selection, "Range").toDispatch(); // Dispatch.call中的参数最多是9个,如果超过9个,请用Dispatch.callN或者Dispathc.invoke /* * Dispatch.invoke(tablesOfContents, "Add", Dispatch.Method,new * Object[]{range,new Variant(true),new Variant(1), new Variant(3),new * Variant(true), new Variant(true),new Variant(true) ,new * Variant("1"),new Variant(true),new Variant(true)},new int[10]); */ Dispatch.callN(tablesOfContents, "Add", new Object[] { range, new Variant(true), new Variant(1), new Variant(3), new Variant(false), new Variant(true), new Variant(true), new Variant("1"), new Variant(true), new Variant(true)}); } /** * 将map中数据插入表格(先行后列)--added by lh. */ public void insertTable(String tableTitle, TreeMap<Integer, String> result) { int row = result.size(); // 表格行数 int column = 2; // 表格列数 Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch(); // 输入内容需要的对象 // 建立表格 Dispatch tables = Dispatch.get(document, "Tables").toDispatch(); Dispatch range = Dispatch.get(selection, "Range").toDispatch();// // 当前光标位置或者选中的区域 Dispatch newTable = Dispatch.call(tables, "Add", range, new Variant(row), new Variant(column), new Variant(1)) .toDispatch(); // 设置row,column,表格外框宽度 Dispatch cells = Dispatch.get(newTable, "Rows").toDispatch(); // 此表的所有行, int rowCount = Dispatch.get(cells, "Count").changeType( Variant.VariantInt).getInt();// 一共有多少行 实际上这个数==column System.out.println(rowCount + "行"); if (rowCount != row) return; Iterator it = result.entrySet().iterator(); for (int i = 1; i <= rowCount; i++) { // 循环取出每一行 Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); putTableCell(newTable, i, 1, key.toString());// putTableCell(newTable, i, 2, value.toString());// } } /** * 从选定内容或插入点开始查找文本. * @param toFindText 要查找的文本 * @return boolean true-查找到并选中该文本,false-未查找到文本 */ public boolean find( final String toFindText) { if (toFindText == null || toFindText.equals("")) { return false; } // 从selection所在位置开始查询 Dispatch find = Dispatch.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 boolean true-查找到并选中该文本,false-未查找到文本 */ public boolean replaceText( final String toFindText, final String newText) { if (!find(toFindText)) { return false; } Dispatch.put(selection, "Text", newText); return true; } /** * 创建表格. * @param numCols 列数 * @param numRows 行数 * @param autoFormat 默认格式 * @return 表格对象 */ public Dispatch createTable( final int numRows, final int numCols, final int autoFormat) { int index = 1; while (true) { try { Dispatch tables = Dispatch.get(document, "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"); Dispatch.call(newTable, "AutoFormat", new Variant(autoFormat)); return newTable; } catch (ComFailException e) { if (index++ >= MAX_RETRY) { throw e; } else { continue; } } } } /** * 在指定的表头里填写数据. * @param table 表格 * @param cellColIdx 列号 * @param txt 文字 * @param style 样式 */ public void putTableHeader( final Dispatch table, final int cellColIdx, final String txt, final String style) { Dispatch cell = Dispatch.call(table, "Cell", new Variant(1), new Variant(cellColIdx)).toDispatch(); Dispatch.call(cell, "Select"); Dispatch.put(selection, "Text", txt); Dispatch.put(this.selection, "Style", getOutlineStyle(style)); } /** * 在指定的表头里填写数据. * @param table 表格 * @param cellColIdx 列号 * @param txt 文字 */ public void putTableHeader( final Dispatch table, final int cellColIdx, final String txt) { Dispatch cell = Dispatch.call(table, "Cell", new Variant(1), new Variant(cellColIdx)).toDispatch(); Dispatch.call(cell, "Select"); Dispatch.put(selection, "Text", txt); } /** * 在指定的单元格里填写数据. * @param table 表格 * @param cellRowIdx 行号 * @param cellColIdx 列号 * @param txt 文字 * @param style 样式 */ public void putTableCell( final Dispatch table, final int cellRowIdx, final int cellColIdx, final String txt, final String style) { Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch(); Dispatch.call(cell, "Select"); Dispatch.put(selection, "Text", txt); Dispatch.put(this.selection, "Style", getOutlineStyle(style)); } /** * 在指定的单元格里填写数据. * @param table 表格 * @param cellRowIdx 行号 * @param cellColIdx 列号 * @param txt 文字 */ public void putTableCell( final Dispatch table, final int cellRowIdx, final int cellColIdx, final String txt) { Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch(); Dispatch.call(cell, "Select"); Dispatch.put(selection, "Text", txt); } /** * 关闭当前word文档. */ private void closeDocument() { if (document != null) { Dispatch.call(document, "Save"); Dispatch.call(document, "Close", new Variant(saveOnExit)); document = null; } } /** * 文件保存或另存为. * @param savePath 保存或另存为路径 */ public void saveFileAs( final String savePath) { Dispatch.call(document, "SaveAs", savePath); } /** * 关闭文档. */ public void close() { closeDocument(); if (wordApp != null) { Dispatch.call(wordApp, "Quit"); wordApp = null; } selection = null; } } package MyJacob; import java.io.File; import java.util.*; import com.jacob.activeX.*; import com.jacob.com.*; public class ExcelService { /** * excel运行程序对象. */ public ActiveXComponent MsExcelApp = null; /** * excel文档. */ private Dispatch workbook = null; private Dispatch sheets = null; private Dispatch sheet = null; /** * 退出时是否保存文档. */ private boolean saveOnExit = true; /** * 构造函数. * @param show 是否可见. */ public ExcelService(final boolean show) { if (MsExcelApp == null) { MsExcelApp = new ActiveXComponent("Excel.Application"); MsExcelApp.setProperty("Visible", new Variant(show)); } } /** * 创建新文档. */ public void newDocument() throws Exception { try { Dispatch xls = MsExcelApp.getProperty("Workbooks").toDispatch(); workbook = Dispatch.call(xls, "Add").toDispatch(); } catch (com.jacob.com.ComFailException cfe) { throw new Exception(cfe.getMessage()); } catch (com.jacob.com.ComException ce) { throw new Exception(ce.getMessage()); } } /** * 设置退出时参数. * @param b boolean true-退出时保存文件,false-退出时不保存文件 */ public void setSaveOnExit(final boolean b) { this.saveOnExit = b; } /** * 关闭当前excel文档. */ private void closeDocument() { if (workbook != null) { Dispatch.call(workbook, "Save"); Dispatch.call(workbook, "Close", new Variant(saveOnExit)); workbook = null; } } /** * 关闭文档. */ public void close() { closeDocument(); if (MsExcelApp != null) { Dispatch.call(MsExcelApp, "Quit"); MsExcelApp = null; } } /** * 打开文档. * * @param xlsName 文档路径. * @throws Exception 异常 */ public void openDocument(final String xlsName) throws Exception { Dispatch xls = MsExcelApp.getProperty("Workbooks").toDispatch(); if (isExist(xlsName)) { this.closeDocument(); workbook = Dispatch.call(xls, "Open", xlsName).toDispatch(); } else { MsExcelApp.invoke("Quit", new Variant[] {}); new Exception("[Open xls failed]: file[" + xlsName + "] isn't existed!"); } } /** * 判断文档是否存在. * @param fileName 文档名称. * @return boolean 是否存在. */ private boolean isExist(final String fileName) { boolean result = false; File file = new File(fileName); result = file.exists(); file = null; return result; } /** * 文件保存或另存为. * @param savePath 保存或另存为路径 */ public void saveFileAs(final String savePath) { Dispatch.call(workbook, "SaveAs", savePath); } // 写入字符类型值 private void SetValue(String position, String value) { sheet = Dispatch.get(workbook, "ActiveSheet").toDispatch(); Dispatch cell = Dispatch.invoke(sheet, "Range", Dispatch.Get, new Object[] { position }, new int[1]).toDispatch(); Dispatch.put(cell, "Value", value); } // 读取字符类型值 private String GetValue(String position) { sheet = Dispatch.get(workbook, "ActiveSheet").toDispatch(); // sheets = Dispatch.call(workbook, "Worksheets").toDispatch(); // sheet = Dispatch.call(sheets, "Item", "Trap告警信息表").toDispatch(); Dispatch cell = Dispatch.invoke(sheet, "Range", Dispatch.Get, new Object[] { position }, new int[1]).toDispatch(); String value = Dispatch.get(cell, "Value").toString(); if(Util.isNumber(value)){ return ((Integer)(int)Double.parseDouble(value)).toString(); } return value; } //读取指定列的指定内容 public ArrayList<String> GetValuesByColumn(String column, int startline, int linecount) { ArrayList<String> result = new ArrayList<String>(); for (int idx = 0; idx < linecount; idx++) { String position = column.toUpperCase() + (startline+idx); result.add(GetValue(position)); } return result; } } package MyJacob; import java.util.ArrayList; import java.util.TreeMap; public class TestMyJacob { public static void main(String[] args) { // TestInsertWordTable(); TestExcel(); } static void TestInsertWordTable(){ try { // (PK_//S*)|(SYS_//S*)|(UID_//S*)|(PNETAPPPP//S*) TreeMap<Integer, String> output = OprOffice.GetResult("C://Documents and Settings//luohao//桌面//IT_DB_INDEX.txt", "(PK_//S*)|(SYS_//S*)|(UID_//S*)|(PNETAPPPP//S*)"); OprOffice.insertWordTable(output,"C://Documents and Settings//luohao//桌面//IT_DB_INDEX_2_doc.doc"); } catch (Exception e) { e.printStackTrace(); } } static void TestExcel(){ try{ }catch(Exception e){ e.printStackTrace(); } } } 有问题欢迎交流。