前言:对于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 倍 = 18
ph.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文档输出流outputStream1
doc.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 org.apachemonspress.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手册在线地址
https://apireference.aspose/words/java/com.aspose.words/Document

更多推荐

Aspose.Words for Java实现Word的操作(创建,合并单元格,样式修改,动态插入数据)并浏览器下载或本地导出