最近有做到一个类似下载学员名册的功能,需要用到aspose来生成文档,感觉每次做这个功能都得找一下之前写过的代码,这里记录一下方便下次使用。
![](https://img-blog.csdnimg.cn/0030362962984ab2a67ef4fc6e5e7d66.png)
1、初始化文档
Document document;
try {
document = new Document();
} catch (Exception e) {
throw TeasException.create(Code.INIT_DOCUMENT_FAIL);
}
DocumentBuilder builder = new DocumentBuilder(document);
builder.getPageSetup().setPaperSize(PaperSize.A4);
builder.getPageSetup().setOrientation(Orientation.PORTRAIT);
2、段落文本,标题书写
//添加⽂字
setFont(builder, "宋体", 16, false, "CENTER");
builder.writeln(StrKit.format("{}{}支委成员、组长名单",className,key));
/**
* 设置字体
*
* @param builder
* @param fontName
* @param fontSize
* @param bold
*/
private void setFont(DocumentBuilder builder, String fontName, double fontSize, boolean bold, String position) {
if ("LEFT".equalsIgnoreCase(position)) {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.LEFT);
} else if ("RIGHT".equalsIgnoreCase(position)) {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.RIGHT);
} else {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.CENTER);
}
builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
builder.getFont().setSize(fontSize);
builder.getFont().setName(fontName);
builder.getFont().setBold(bold);
}
3、构建表格
Table table = builder.startTable();
// 设置头
RowFormat headRow = builder.getRowFormat();
headRow.setHeight(28);
createCell(builder,"支部分工",80,"CENTER","宋体",12,false);
createCell(builder,"姓 名",54,"CENTER","宋体",12,false);
createCell(builder,"工 作 单 位 及 职 务",100,"LEFT","宋体",12,false);
createCell(builder,"楼房号",54,"CENTER","宋体",12,false);
createCell(builder,"房间电话",60,"CENTER","宋体",12,false);
createCell(builder,"手机",80,"CENTER","宋体",12,false);
// 结束这一行
builder.endRow();
// 结束表格
builder.endTable();
private void createCell(DocumentBuilder builder, String content,int width,String position,String fontName,int fontSize,boolean bold) {
builder.insertCell();
builder.getCellFormat().setWidth(width);
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
setFont(builder, fontName, fontSize, bold, position);
builder.write(StrKit.isNotBlank(content) ? content : "" );
}
private void createCell(DocumentBuilder builder, String content,int width,String position,String fontName,int fontSize,boolean bold,int merge) {
builder.insertCell();
builder.getCellFormat().setWidth(width);
switch(merge) {
case 1:
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
break;
case 2:
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
break;
case 3:
builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
break;
case 4:
builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
break;
default:
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
break;
}
setFont(builder, fontName, fontSize, bold, position);
builder.write(StrKit.isNotBlank(content) ? content : "" );
}
如果需要合并单元格,可以使用第二个创建单元格的方法,与第一个不同的是最后一个参数 int merge,水平合并时用 3、4;垂直合并时用1、2,例如:
① 垂直合并:
// 合并单元格
if (!StrKit.equals(roleName.get(),teacherRosterDto.getRoleName())){
// 不相等时是第一个需要合并的单元格
createCell(builder,teacherRosterDto.getRoleName(),80,"CENTER","宋体",12,false,1);
}else{
// 相等时是等待被合并的单元格
createCell(builder,teacherRosterDto.getRoleName(),80,"CENTER","宋体",12,false,2);
}
② 水平合并
createCell(builder,"办公室房号及电话",40,"CENTER","黑体",12,false,3);
createCell(builder,"",80,"CENTER","黑体",12,false,4);
4、文件下载
String savePath = uploadProp.getVirtualPath()+"/" + className +"支委名册.doc";
try {
document.save(savePath, SaveFormat.DOC);
} catch (Exception e) {
throw TeasException.create(Code.DOWNLOAD_DOCUMENT_FAIL);
}
FileKit.output(response, request, new File(savePath));
附加一个完整的方法
@Override
public void exportBranchCommitteeRoster(HttpServletRequest request, HttpServletResponse response, String classId) {
if (StrKit.isBlank(classId)){
throw TeasException.create(Code.ARGS_ERROR);
}
// 班级信息
Record classInfo = Db.findFirst(Db.getSqlPara(sqlKey + "queryClassInfo", Kv.by("classId", classId)));
List<Record> stuList = Db.find(Db.getSqlPara(sqlKey + "queryStudent", Kv.byWithTeasShard("classid", classId)));
stuList = stuList.stream()
.filter(item -> StrKit.isNotBlank(item.getStr("inclassposition_text")))
.sorted(Comparator.comparing(item -> item.getInt("ds_order")))
.collect(Collectors.toList());
Map<String, List<Record>> branchMap = stuList.stream().collect(Collectors.groupingBy(item -> item.getStr("branch_text")));
String className = classInfo.getStr("bcmc");
// 处理表格
this.getLicenseInput();
Document document;
try {
document = new Document();
} catch (Exception e) {
throw TeasException.create(Code.INIT_DOCUMENT_FAIL);
}
DocumentBuilder builder = new DocumentBuilder(document);
builder.getPageSetup().setPaperSize(PaperSize.A4);
builder.getPageSetup().setOrientation(Orientation.PORTRAIT);
branchMap.forEach((key, value) -> {
//添加⽂字
setFont(builder, "宋体", 16, false, "CENTER");
builder.writeln(StrKit.format("{}{}支委成员、组长名单",className,key));
Table table = builder.startTable();
// 设置头
RowFormat headRow = builder.getRowFormat();
headRow.setHeight(28);
createCell(builder,"支部分工",80,"CENTER","宋体",12,false);
createCell(builder,"姓 名",54,"CENTER","宋体",12,false);
createCell(builder,"工 作 单 位 及 职 务",100,"LEFT","宋体",12,false);
createCell(builder,"楼房号",54,"CENTER","宋体",12,false);
createCell(builder,"房间电话",60,"CENTER","宋体",12,false);
createCell(builder,"手机",80,"CENTER","宋体",12,false);
builder.endRow();
value.forEach(stu -> {
RowFormat bodyRow = builder.getRowFormat();
bodyRow.setHeight(36);
String duty = stu.getStr("inclassposition_text");
if (!duty.contains("组长")){
createCell(builder,duty,80,"CENTER","宋体",12,false);
}else{
createCell(builder,stu.getStr("stu_group_text"),40,"CENTER","宋体",12,false);
createCell(builder,duty,40,"CENTER","宋体",12,false);
}
createCell(builder,stu.getStr("name"),54,"CENTER","宋体",12,false);
createCell(builder,stu.getStr("deptpost"),100,"LEFT","宋体",12,false);
createCell(builder,stu.getStr("stu_building"),54,"CENTER","宋体",12,false);
createCell(builder,"",60,"CENTER","宋体",12,false);
createCell(builder,stu.getStr("stu_phone"),80,"CENTER","宋体",12,false);
builder.endRow();
});
builder.endTable();
try {
table.setBorder(BorderType.TOP,LineStyle.DOUBLE,1,Color.BLACK,false);
table.setBorder(BorderType.LEFT,LineStyle.DOUBLE,1,Color.BLACK,false);
table.setBorder(BorderType.BOTTOM,LineStyle.DOUBLE,1,Color.BLACK,false);
table.setBorder(BorderType.RIGHT,LineStyle.DOUBLE,1,Color.BLACK,false);
} catch (Exception e) {
throw TeasException.create(Code.SET_DOCUMENT_STYLE_FAIL);
}
builder.insertBreak(BreakType.PARAGRAPH_BREAK);
});
String savePath = uploadProp.getVirtualPath()+"/" + className +"支委名册.doc";
try {
document.save(savePath, SaveFormat.DOC);
} catch (Exception e) {
throw TeasException.create(Code.DOWNLOAD_DOCUMENT_FAIL);
}
FileKit.output(response, request, new File(savePath));
}
private void createCell(DocumentBuilder builder, String content,int width,String position,String fontName,int fontSize,boolean bold) {
builder.insertCell();
builder.getCellFormat().setWidth(width);
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
setFont(builder, fontName, fontSize, bold, position);
builder.write(StrKit.isNotBlank(content) ? content : "" );
}
private void createCell(DocumentBuilder builder, String content,int width,String position,String fontName,int fontSize,boolean bold,int merge) {
builder.insertCell();
builder.getCellFormat().setWidth(width);
switch(merge) {
case 1:
builder.getCellFormat().setVerticalMerge(CellMerge.FIRST);
break;
case 2:
builder.getCellFormat().setVerticalMerge(CellMerge.PREVIOUS);
break;
case 3:
builder.getCellFormat().setHorizontalMerge(CellMerge.FIRST);
break;
case 4:
builder.getCellFormat().setHorizontalMerge(CellMerge.PREVIOUS);
break;
default:
builder.getCellFormat().setVerticalMerge(CellMerge.NONE);
builder.getCellFormat().setHorizontalMerge(CellMerge.NONE);
break;
}
setFont(builder, fontName, fontSize, bold, position);
builder.write(StrKit.isNotBlank(content) ? content : "" );
}
/**
* 去除水印
*
*/
private void getLicenseInput() {
InputStream inputStream;
try {
inputStream = this.getClass().getClassLoader().getResourceAsStream("license.xml");
License license = new License();
license.setLicense(inputStream);
} catch (Exception var1) {
var1.printStackTrace();
throw new RuntimeException("自动加载aspose证书文件失败!");
}
}
/**
* 设置字体
*
* @param builder
* @param fontName
* @param fontSize
* @param bold
*/
private void setFont(DocumentBuilder builder, String fontName, double fontSize, boolean bold, String position) {
if ("LEFT".equalsIgnoreCase(position)) {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.LEFT);
} else if ("RIGHT".equalsIgnoreCase(position)) {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.RIGHT);
} else {
builder.getParagraphFormat().setAlignment(com.aspose.words.ParagraphAlignment.CENTER);
}
builder.getCellFormat().setVerticalAlignment(CellVerticalAlignment.CENTER);
builder.getFont().setSize(fontSize);
builder.getFont().setName(fontName);
builder.getFont().setBold(bold);
}