Java SWT操作Word文档

Sky_kong 贡献于2011-08-18

作者 微软用户  创建于2011-08-18 05:48:00   修改者微软用户  修改于2011-08-18 05:50:00字数9980

文档摘要:
关键词:

package com.ui.input; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import org.eclipse.swt.widgets.DateTime; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class Java2Word { private boolean saveOnExit; /** * word文档 */ Dispatch doc = null; /** * word运行程序对象s */ private ActiveXComponent word; /** * 所有word文档 */ private Dispatch documents; /** * 构造函数 */ public Java2Word() { if(word==null){ word = new ActiveXComponent("Word.Application"); word.setProperty("Visible",new Variant(false)); } if(documents==null) documents = word.getProperty("Documents").toDispatch(); saveOnExit = false; } /** * 设置参数:退出时是否保存 * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件 */ public void setSaveOnExit(boolean saveOnExit) { this.saveOnExit = saveOnExit; } /** * 得到参数:退出时是否保存 * @return boolean true-退出时保存文件,false-退出时不保存文件 */ public boolean getSaveOnExit() { return saveOnExit; } /** * 打开文件 * @param inputDoc String 要打开的文件,全路径 * @return Dispatch 打开的文件 */ public Dispatch open(String inputDoc) { return Dispatch.call(documents,"Open",inputDoc).toDispatch(); //return Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new int[1]).toDispatch(); } /** * 选定内容 * @return Dispatch 选定的范围或插入点 */ public Dispatch select() { return word.getProperty("Selection").toDispatch(); } /** * 把选定内容或插入点向上移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveUp(Dispatch selection,int count) { for(int i = 0;i < count;i ++) Dispatch.call(selection,"MoveUp"); } /** * 把选定内容或插入点向下移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveDown(Dispatch selection,int count) { for(int i = 0;i < count;i ++) Dispatch.call(selection,"MoveDown"); } /** * 把选定内容或插入点向左移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveLeft(Dispatch selection,int count) { for(int i = 0;i < count;i ++) { Dispatch.call(selection,"MoveLeft"); } } /** * 把选定内容或插入点向右移动 * @param selection Dispatch 要移动的内容 * @param count int 移动的距离 */ public void moveRight(Dispatch selection,int count) { for(int i = 0;i < count;i ++) Dispatch.call(selection,"MoveRight"); } /** * 把插入点移动到文件首位置 * @param selection Dispatch 插入点 */ public void moveStart(Dispatch selection) { Dispatch.call(selection,"HomeKey",new Variant(6)); } /** * 从选定内容或插入点开始查找文本 * @param selection Dispatch 选定内容 * @param toFindText String 要查找的文本 * @return boolean true-查找到并选中该文本,false-未查找到文本 */ public boolean find(Dispatch selection,String toFindText) { //从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 selection Dispatch 选定内容 * @param newText String 替换为文本 */ public void replace(Dispatch selection,String newText) { //设置替换文本 Dispatch.put(selection,"Text",newText); } /** * 全局替换 * @param selection Dispatch 选定内容或起始插入点 * @param oldText String 要替换的文本 * @param newText String 替换为文本 */ public void replaceAll(Dispatch selection,String oldText,Object replaceObj) { //移动到文件开头 moveStart(selection); if(oldText.startsWith("table") || replaceObj instanceof ArrayList) replaceTable(selection,oldText,(ArrayList) replaceObj); else { String newText = (String) replaceObj; if(newText==null) newText=""; if(oldText.indexOf("image") != -1&!newText.trim().equals("") || newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 || newText.lastIndexOf(".gif") != -1){ while(find(selection,oldText)) { replaceImage(selection,newText); Dispatch.call(selection,"MoveRight"); } }else{ while(find(selection,oldText)) { replace(selection,newText); Dispatch.call(selection,"MoveRight"); } } } } /** * 替换图片 * @param selection Dispatch 图片的插入点 * @param imagePath String 图片文件(全路径) */ public void replaceImage(Dispatch selection,String imagePath) { Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath); } /** * 替换表格 * @param selection Dispatch 插入点 * @param tableName String 表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充,N代表word文件中的第N张表 * @param fields HashMap 表格中要替换的字段与数据的对应表 */ public void replaceTable(Dispatch selection,String tableName,ArrayList dataList) { if(dataList.size() <= 1) { System.out.println("Empty table!"); return; } //要填充的列 String[] cols = (String[]) dataList.get(0); //表格序号 String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1); //从第几行开始填充 int fromRow = Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") + 1,tableName.lastIndexOf("@"))); //所有表格 Dispatch tables = Dispatch.get(doc,"Tables").toDispatch(); //要填充的表格 Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex)).toDispatch(); //表格的所有行 Dispatch rows = Dispatch.get(table,"Rows").toDispatch(); //填充表格 for(int i = 1;i < dataList.size();i ++) { //某一行数据 String[] datas = (String[]) dataList.get(i); //在表格中添加一行 if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1) Dispatch.call(rows,"Add"); //填充该行的相关列 for(int j = 0;j < datas.length;j ++) { //得到单元格 Dispatch cell = Dispatch.call(table,"Cell",Integer.toString(fromRow + i - 1),cols[j]).toDispatch(); //选中单元格 Dispatch.call(cell,"Select"); //设置格式 Dispatch font = Dispatch.get(selection,"Font").toDispatch(); Dispatch.put(font,"Bold","0"); Dispatch.put(font,"Italic","0"); //输入数据 Dispatch.put(selection,"Text",datas[j]); } } } /** * 保存文件 * @param outputPath String 输出文件(包含路径) */ public void save(String outputPath) { Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath); } /** * 关闭文件 * @param document Dispatch 要关闭的文件 */ public void close(Dispatch doc) { Dispatch.call(doc,"Close",new Variant(saveOnExit)); word.invoke("Quit",new Variant[]{}); word = null; } /** * 根据模板、数据生成word文件 * @param inputPath String 模板文件(包含路径) * @param outPath String 输出文件(包含路径) * @param data HashMap 数据包(包含要填充的字段、对应的数据) */ public void toWord(String inputPath,String outPath,HashMap data) { String oldText; Object newValue; try { if(doc==null) doc = open(inputPath); Dispatch selection = select(); Iterator keys = data.keySet().iterator(); while(keys.hasNext()) { oldText = (String) keys.next(); newValue = data.get(oldText); replaceAll(selection,oldText,newValue); } save(outPath); } catch(Exception e) { System.out.println("操作word文件失败!"); e.printStackTrace(); } finally { if(doc != null) close(doc); } } public synchronized static void word(String inputPath,String outPath,HashMap data){ Java2Word j2w = new Java2Word(); j2w.toWord(inputPath,outPath,data); } public static long Input(String name,String qq,String pwd,String oaname) { HashMap data = new HashMap(); data.put("$a$",name); data.put("$b$",qq); data.put("$c$",pwd); data.put("$d$",oaname); Java2Word j2w = new Java2Word(); long time1 = System.currentTimeMillis(); j2w.toWord("D:\\doc\\tax\\新员工入司需知.doc","D:\\新员工入司需知.doc",data); return (System.currentTimeMillis() - time1); } } --------------------------------------------分割线--------------------------------------------------- //测试类。没有全调用Java2Word的方法。。太麻烦- - package com.ui.input; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import com.sun.xml.internal.ws.api.message.Message; import org.eclipse.wb.swt.SWTResourceManager; public class Test { protected Shell shell; private Label lblNewLabel; private Label lblqq; private Label lblOa; private Label label_2; private Label lblQq; private Text textname; private Text textqq; private Text textpwd; private Text textoa; private Button btnNewButton; private Button btnNewButton_1; private Button button; /** * Launch the application. * * @param args */ public static void main(String[] args) { try { Test window = new Test(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window. */ public void open() { Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the window. */ protected void createContents() { shell = new Shell(); shell = new Shell(SWT.CLOSE);//实例化窗体只有关闭按钮 shell = new Shell(SWT.MIN | SWT.CLOSE);//实例化窗体 不允许改变大小 shell.setImage(SWTResourceManager.getImage(Test.class, "/images/RF.png")); //shell.setImage(SWTResourceManager.getImage("..\\images\\RF.png")); shell.setSize(443, 295); shell.setText("\u65B0\u5458\u5DE5\u5165\u804C\u901A\u77E5\u5355"); lblNewLabel = new Label(shell, SWT.NONE); lblNewLabel.setBounds(57, 43, 54, 12); lblNewLabel.setText("\u5458\u5DE5\u59D3\u540D\uFF1A"); lblqq = new Label(shell, SWT.NONE); lblqq.setText("\u5458\u5DE5QQ\uFF1A"); lblqq.setBounds(57, 77, 54, 12); lblOa = new Label(shell, SWT.NONE); lblOa.setText("OA\u8D26\u53F7\uFF1A"); lblOa.setBounds(57, 143, 54, 12); label_2 = new Label(shell, SWT.NONE); label_2.setText("\u5458\u5DE5\u59D3\u540D\uFF1A"); label_2.setBounds(44, 129, 54, -11); lblQq = new Label(shell, SWT.NONE); lblQq.setText("QQ\u5BC6\u7801\uFF1A"); lblQq.setBounds(57, 103, 54, 12); textname = new Text(shell, SWT.BORDER); textname.setBounds(144, 40, 141, 18); textqq = new Text(shell, SWT.BORDER); textqq.setBounds(144, 74, 141, 18); textpwd = new Text(shell, SWT.BORDER); textpwd.setBounds(144, 100, 141, 18); textoa = new Text(shell, SWT.BORDER); textoa.setBounds(144, 140, 141, 18); btnNewButton = new Button(shell, SWT.NONE); btnNewButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Java2Word jWord = new Java2Word(); String name = textname.getText(); String qq = textqq.getText(); String pwd = textpwd.getText(); String oaname = textoa.getText(); long lg = jWord.Input(name, qq, pwd, oaname); if (lg==0) { MessageBox messageBox = new MessageBox(shell, SWT.ERROR | SWT.YES | SWT.OK); messageBox.setMessage("添加失败!"); messageBox.setText("提示"); messageBox.open(); }else{ MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION); messageBox.setMessage("添加成功!"); messageBox.setText("提示"); messageBox.open(); } } }); btnNewButton.setBounds(90, 199, 72, 22); btnNewButton.setText("\u786E\u5B9A"); btnNewButton_1 = new Button(shell, SWT.NONE); btnNewButton_1.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { textname.setText(""); textoa.setText(""); textpwd.setText(""); textqq.setText(""); } }); btnNewButton_1.setBounds(298, 199, 72, 22); btnNewButton_1.setText("\u91CD\u7F6E"); button = new Button(shell, SWT.NONE); button.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { shell.close(); } }); button.setText("\u5173\u95ED"); button.setBounds(192, 199, 72, 22); } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档