Spire操作word文档

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;
        }
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值