前言:对于Aspose.Words这个实用的插件,网上相关资料很多都是.NET,C#的写法,很少有JAVA相关的,而且比较乱,因客户需求导出Word内嵌表格功能,我才开始研究,查阅了很多大佬的资料,外加自己查看官方API手册,最终完成完善.下面分享给大家,有问题的可以评论告知多多支持!
下面以菜鸟程序员的视角带大家学习这个实用的功能.
1. 引入Maven坐标,本插件收费,但是办法总比困难多,大佬们自行百度解决.
2. 写授权配置,后续有用.
3. 这是鉴权代码,请在输出word的那个类开头添加.
InputStream is = DocTransformUtil.class.getClassLoader().getResourceAsStream("license-word.xml");License aposeLic = new License();aposeLic.setLicense(is);
4. 下面用于生成Word的一些常见方法展示
入门,简单的示例
Document doc = new Document();//新建一个空白文档DocumentBuilder builder = new DocumentBuilder(doc);doc.Save("文件保存的全路径");
这里面的`builder`相当于一个画笔,提前给他规定样式,然后他就能根据你的要求画出你想画的Word。这里的画笔使用的是就近原则,当上面没有定义了builder的时候,会使用默认的格式,当上面定义了某个格式的时候,使用最近的一个(即最后一个改变的样式)
设定Word页面的样式
builder.getPageSetup().setPaperSize(PaperSize.A4)//A4纸builder.getPageSetup().setOrientation(Orientation.PORTRAIT)//方向builder.getPageSetup().setVerticalAlignment(PageVerticalAlignment.TOP) //垂直对准builder.getPageSetup().setLeftMargin(42)//页面左边距builder.getPageSetup().setRightMargin(42)//页面右边距
写入一段文字
//获取ParagraphFormat对象,关于行的样式基本都在这里ParagraphFormat ph = builder.getParagraphFormat();//文字对齐方式ph.setAlignment(ParagraphAlignment.CENTER) ;// 单倍行距 = 12 , 1.5 倍 = 18ph.setLineSpacing(12);//获取Font对象,关于文字的大小,颜色,字体等等基本都在这个里面Aspose.Words.Font font = builder.Font;//字体大小font.Size = 22;//是否粗体font.Bold = false;//下划线样式,None为无下划线font.Underline = Underline.None;//字体颜色font.Color = Color.Black;//C#的颜色font.Color = System.Drawing.ColorTranslator.FromHtml("#3b3131");//自定义颜色//设置字体font.NameFarEast = "宋体";//添加文字builder.Write("添加的文字");//添加回车builder.Writeln();//添加文字后回车builder.Writeln("添加的文字后回车");
添加图片
builder.InsertImage("图片绝对地址");builder.InsertImage("图片绝对地址", 80, 80);//可以控制图片的宽高
添加表格
//开始添加表格Table table = builder.startTable();//开始添加第一行,并设置表格行高RowFormat rowf = builder.getRowFormat();rowf.setHeight(40) ;// ....这里rowf可以有很多的设置//插入一个单元格builder.insertCell();//设置单元格是否水平合并builder.getCellFormat().setHorizontalMerge(CellMerge.NONE) ;//设置单元格是否垂直合并,None为不合并builder.getCellFormat().setVerticalMerge(CellMerge.NONE);//设置单元格宽builder.getCellFormat().setWidth(40) ;//单元格垂直对齐方向builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);//单元格水平对齐方向builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT);builder.getCellFormat().setFitText(true);//单元格内文字设为多行(默认为单行,会影响单元格宽)//单元格内添加文字builder.write("这是第一行第一个单元格");builder.InsertCell();builder.getCellFormat().setWidth(-1);//当不需要规定这个单元格的宽度的时候,设置成-1,会是自动宽度builder.write("这是第一行第二个单元格");//结束第一行builder.endRow();//结束表格builder.endTable();//设置这个表格的上下左右,内部水平,垂直的线为白色(当背景为白色的时候就相当于隐藏边框了)table.setBorder(BorderType.LEFT, LineStyle.DOUBLE, 1, Color.WHITE, false);table.setBorder(BorderType.TOP, LineStyle.DOUBLE, 1, Color.WHITE, false);table.setBorder(BorderType.RIGHT, LineStyle.DOUBLE, 1, Color.WHITE, false);table.setBorder(BorderType.BOTTOM, LineStyle.DOUBLE, 1, Color.WHITE, false);table.setBorder(BorderType.VERTICAL, LineStyle.DOUBLE, 1, Color.WHITE, false);
表格的合并单元格
注意:最重要的是不用忘记开始表格,开始一行,结束一行,结束表格里面的设置可以根据个人需要修改,也可以不写使用默认的
表格的合并单元格
//横向合并单元格builder.CellFormat.setHorizontalMerge = CellMerge.None;builder.getCellFormat().setHorizontalMerge (CellMerge.FIRST);builder.CellFormat.setHorizontalMerge = CellMerge.Previous;//纵向合并单元格builder.getCellFormat().setVerticalMerge(CellMerge.NONE);builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
备注:NONE为不合并,FIRST为要合并的单元格,PREVIOUS为和FIRST标记的单元格合并,并且以FIST标记的单元格为主,PREVIOUS标记的单元格不需要写入内容,自己测试下就懂了
5.按以上方法生成自己需要的word后,可以选择导入本地或者浏览器下载2种方式满足不同需求.
通过IO流写入本地
String outPath = "D:\\ceshi.docx";String path = outPath.substring(0, outPath.lastIndexOf(File.separator));File file = new File(path);if (!file.exists()) {//创建文件夹file.mkdirs();}file = new File(outPath);// 新建一个空白pdf文档FileOutputStream os = new FileOutputStream(file);//接下来这里是创建文档,省略N字..................doc.save(os, SaveFormat.HTML);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,os.close();//关流
通过IO流实现浏览器下载到本地
//Word文档输出流OutputStream outputStream1 = null;//下载输出流OutputStream outputStream = null;//下载输入流InputStream inputStream = null;//创建临时文件File wordFile = File.createTempFile("tempWord", ".docx");outputStream1 = new FileOutputStream(wordFile);//接下来这里是创建文档,省略N字..................//保存文档数据到Word文档输出流outputStream1doc.save(outputStream1, SaveOptions.createSaveOptions(SaveFormat.DOCX));//生成docx文件//生成Word文档之后,关闭输入流outputStream1.close();//文件下载// response.reset();//慎用,reset()用于重置,但是在重置的时候也会清空相关数据,例如session存的信息response.setContentType("application/msword");response.setCharacterEncoding("UTF-8");long timelong = System.currentTimeMillis();String time = String.valueOf(timelong);response.addHeader("Content-Disposition", "attachment;filename=\"" + time +".docx" +"\"");response.flushBuffer();outputStream = response.getOutputStream();//输出文件----另外说下IOUtils工具类是package press.utils;inputStream = new FileInputStream(wordFile);IOUtils.copy(inputStream, outputStream);//关闭流IOUtils.closeQuietly(inputStream);IOUtils.closeQuietly(outputStream);//关闭程序时,删除临时文件wordFile.delete();
6.注意事项
关流
//关流这是必须要做的,推荐大家这样关流,首先try{}内包裹的业务代码创建流后需要关闭,最后还需要在finally{}内判断关流.try{//这里写业务代码} catch (Exception e) {e.printStackTrace();} finally {//关闭所有的流try {if (outputStream != null) {outputStream.close();}} catch (IOException e1) {e1.printStackTrace();}}
调整单元格样式,关闭表格自适应宽度.
//这是我写的过程中遇到的问题,调表格样式的时候,改的宽度总是达不到要求,刚开始我使用的是
builder.getCellFormat().setFitText(true);
这个导致只关闭了一个单元格自适应,但是其他单元格还是自适应,这样导致样式始终不符合预期.
//解决方案---这是创建表格刚开始的语句Table table = builder.startTable();//然后调用table.autoFit(AutoFitBehavior.FIXED_COLUMN_WIDTHS);
最后:大家一起交流学习进步,加油!
//Aspose.Words for Java官方API手册在线地址/words/java/com.aspose.words/Document
Aspose.Words for Java实现Word的操作(创建 合并单元格 样式修改 动态插入数据)并浏览器下载或本地导出