Spire操作word文档
1、基本文档方面
// 测试用例
PersonalCreditRecord credit = getPersonalCreditRecord();
//Create word document.
Document document =new Document();
//Add a new section.
Section section = createSectionTitle(document);
// 信息汇总
setSummaryCredit(section, credit);
创建word,并使用信息填充
(这里不仅仅是信息的填充,还有文档格式的设置等)
private static void setSummaryCredit(Section section, PersonalCreditRecord r) {
Paragraph paragraph1 = section.addParagraph();
TextRange tr1 = paragraph1.appendText("\r\n信息汇总\r\n");
tr1.getCharacterFormat().setFontSize(16);
tr1.getCharacterFormat().setFontName("黑体");
tr1.getCharacterFormat().setBold(true);
Paragraph paragraph2 = section.addParagraph();
TextRange tr2 = paragraph2.appendText("个人姓名:"+ r.getName()+"\r\n"
+ "\r\n申请时间:"+ r.getApplyTime()+"\r\n"
+ "\r\n生效时间:"+ r.getValidTime()+"\r\n");
tr2.getCharacterFormat().setFontSize(10.5f);
tr2.getCharacterFormat().setFontName("宋体");
}
2、表格方面
// 基本信息
Document document1 =new Document();
Section section1 = createSection(document1);
crateSecodTitle(section1,"基本信息");
createBaseInfoPart(section1, credit.getBaseCredit().getBaseInfoSubTypeList());
addLineBreak(section1);
创建表格,并填充内容
包括格式的设置
private static void createBaseInfoPart(Section section,
List<PersonalBaseInfoSubTypeCredit> baseInfoSubTypeList) {
if(GcmsListUtils.isEmptyList(baseInfoSubTypeList)){
return ;
}
// 实现表格的循环
for (PersonalBaseInfoSubTypeCredit subType : baseInfoSubTypeList) {
// 子类型标题
setBaseInfoSubTypeTitle(section, subType);
List<PersonalBaseInfoSubTypeCreditChild> subTypeChild = subType.getSubTypeChild();
for (PersonalBaseInfoSubTypeCreditChild stc : subTypeChild) {
PersonalBaseTablePO po1 = new PersonalBaseTablePO();
po1.setTitle("评分");
po1.getList().add(new PersonalNameAndValue("评价内容",stc.getEvaluateContent()));
po1.getList().add(new PersonalNameAndValue("评分标准",stc.getEvaluateStandard()));
po1.getList().add(new PersonalNameAndValue("评分",stc.getEvaluateScore()));
crateBaseInfoTable(section,po1);
PersonalBaseTablePO po11 = new PersonalBaseTablePO();
po11.setTitle("评分信息");
po11.getList().addAll(stc.getEvaluateList());
// 实现表格行的循环
crateBaseInfoTable(section,po11);
}
}
}
private static void crateBaseInfoTable(Section section, PersonalBaseTablePO po1) {
int rowNum = po1.getList().size() + 1;
// 创建表
Table table = createTable(section, rowNum);
// Title
setTitleCellValue(po1.getTitle(), table);
// 给表格复制
for (int i = 0; i <po1.getList().size() ;i++) {
TableRow row201202 = table.getRows().get(i+1);
// 给两列赋值
setPramsCellValue(row201202,0,po1.getList().get(i).getName());
setPramsCellValue(row201202,1,po1.getList().get(i).getValue());
}
}
3、对多个文档进行合并
// 合并文档
XWPFDocument outDocument = this.mergeDoc(document,document1);
/**
* 合并docx文件
* srcDocxs 需要合并的目标docx文件
* destDocx 合并后的docx输出文件
*/
public XWPFDocument mergeDoc(Document ... ds)throws Exception{
if(ds == null || ds.length == 0 ){
return null;
}
OutputStream dest = null;
List<OPCPackage> opcpList = new ArrayList<OPCPackage>();
List<File> tempFileList = new ArrayList<File>();
/**
* 循环获取每个docx文件的OPCPackage对象
*/
for(int i=0;i<ds.length;i++){
File tempFile1 = getTempFile(ds[i]);
tempFileList.add(tempFile1);
OPCPackage srcPackage = null;
try {
srcPackage = OPCPackage.open(tempFile1);
} catch (Exception e) {
e.printStackTrace();
}
if(null != srcPackage){
opcpList.add(srcPackage);
}
}
int opcpSize = opcpList.size();
//获取的OPCPackage对象大于0时,执行合并操作
if(opcpSize > 0){
try {
XWPFDocument src1Document = new XWPFDocument(opcpList.get(0));
CTBody src1Body = src1Document.getDocument().getBody();
//OPCPackage大于1的部分执行合并操作
if(opcpSize > 1){
for (int i = 1; i < opcpSize; i++) {
OPCPackage src2Package = opcpList.get(i);
@SuppressWarnings("resource")
CTBody src2Body = new XWPFDocument(src2Package).getDocument().getBody();
appendBody(src1Body, src2Body);
}
}
//将合并的文档写入目标文件中
return src1Document;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
//注释掉以下部分,去除影响目标文件srcDocxs。
/*for (OPCPackage opcPackage : opcpList) {
if(null != opcPackage){
try {
opcPackage.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}*/
//关闭流
IOUtils.closeQuietly(dest);
for (File file : tempFileList) {
try {
file.deleteOnExit();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
return null;
}
/**
* 合并文档内容
* @param src 目标文档
* @param append 要合并的文档
* @throws Exception
*/
private void appendBody(CTBody src, CTBody append) throws Exception {
XmlOptions optionsOuter = new XmlOptions();
optionsOuter.setSaveOuter();
String appendString = append.xmlText(optionsOuter);
String srcString = src.xmlText();
String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
String mainPart = srcString.substring(srcString.indexOf(">") + 1,
srcString.lastIndexOf("<"));
String sufix = srcString.substring(srcString.lastIndexOf("<"));
String addPart = appendString.substring(appendString.indexOf(">") + 1,
appendString.lastIndexOf("<"));
CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart
+ sufix);
src.set(makeBody);
}
将两个文档可以合并在一起,这样就可以有超多的花样来玩儿
附加(文件下载)
//保存文档
try(ServletOutputStream out = response.getOutputStream()) {
response.reset();
String fileName = URLEncoder.encode(credit.getName()+"信用文档"+GcmsDateUtil.currentTimeMillis()+".docx", StandardCharsets.UTF_8.toString());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
//特殊处理,解决 Safari 浏览器下载文件名中文乱码问题。
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename*=utf-8''" + fileName);
//解决前端跨域提示问题。
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Cache-Control","no-cache");
outDocument.write(out);
out.flush();
} catch (IOException e) {
throw e;
}