Java使用aspose.word插件生成并下载文档

        最近有做到一个类似下载学员名册的功能,需要用到aspose来生成文档,感觉每次做这个功能都得找一下之前写过的代码,这里记录一下方便下次使用。

需求样例
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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值