aspose-words
aspose注册
static { try (InputStream is = AsposeUtil.class.getResourceAsStream("/license.xml")) { License aposeLic = new License(); aposeLic.setLicense(is); } catch (Exception e) { e.printStackTrace(); } }
license.xml
<?xml version="1.0" encoding="UTF-8" ?> <License> <Data> <Products> <Product>Aspose.Total for Java</Product> <Product>Aspose.Words for Java</Product> </Products> <EditionType>Enterprise</EditionType> <SubscriptionExpiry>20991231</SubscriptionExpiry> <LicenseExpiry>20991231</LicenseExpiry> <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber> </Data> <Signature> sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU= </Signature> </License>
基本操作
原文:https://blog.csdn.net/qq_38819293/article/details/126746338
1.创建word文档
//创建文档 Document doc = new Document(path); //创建空文档 Document doc = new Document(); //获取光标 DocumentBuilder builder = new DocumentBuilder(doc); //writeln 方法和 write 方法的区别在于, writeln 在文本之后插入了一个段落终止符 builder.writeln("Hello,Lain!"); //文件保存路径 doc.save(path);
2.设置段落格式
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.writeln("Hello,Lain!"); builder.getFont().setColor(Color.decode("#66ccff"));//设置颜色 builder.getFont().setBold(true);//设置粗体 builder.getFont().setItalic(true);//设置斜体 builder.getFont().setName("微软雅黑");//设置字体 builder.getFont().setHighlightColor(Color.gray);//设置背景高亮 builder.getFont().setUnderlineColor(Color.RED);//设置字体颜色 builder.getFont().setUnderline(Underline.DOUBLE);//设置下划线 /* * 缩进 */ builder.getParagraphFormat().setFirstLineIndent(30);//首行缩进 builder.getParagraphFormat().setLeftIndent(30);//缩进:文本之前 builder.getParagraphFormat().setRightIndent(30);//缩进:文本之后 /* * 行距: * AT_LEAST 最小值 * EXACTLY 固定值 * MULTIPLE 多倍行距 * 注:多倍行距的值以12为基准,12为一倍行距,24为两倍,以此类推 */ builder.getParagraphFormat().setLineSpacingRule(LineSpacingRule.MULTIPLE); builder.getParagraphFormat().setLineSpacing(24); builder.getParagraphFormat().setSpaceBefore(10);//段前,单位磅 builder.getParagraphFormat().setSpaceAfter(10);//段后,单位磅 /* * 对齐方式 * CENTER 居中对齐 * DISTRIBUTED 分散对齐 * JUSTIFY 两端对齐 * LEFT 左对齐 * RIGHT 右对齐 */ builder.getParagraphFormat().setAlignment(ParagraphAlignment.RIGHT); builder.getParagraphFormat().setBidi(false);//方向:true 从右向左 builder.writeln("Present Day,Present Time!Ahhhhhhh"); doc.save(getTempFileName());
3.页面分隔
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.writeln("This is the 1st section,1st Page"); builder.insertBreak(BreakType.PAGE_BREAK);//分页符 builder.writeln("This is the 1st section,2nd Page"); builder.insertBreak(BreakType.LINE_BREAK);//换行符 builder.insertBreak(BreakType.COLUMN_BREAK);//分栏符 builder.insertBreak(BreakType.SECTION_BREAK_CONTINUOUS);//连续分节符 builder.writeln("This is the 3rd section,1nd Page"); builder.writeln("连续分节符"); builder.insertBreak(BreakType.SECTION_BREAK_EVEN_PAGE);//偶数页分节符 builder.writeln("This is the 4th section,1nd Page"); builder.writeln("偶数页分节符"); builder.insertBreak(BreakType.SECTION_BREAK_ODD_PAGE);//奇数页分节符 builder.writeln("This is the 5th section,1nd Page"); builder.writeln("奇数页分节符"); builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE);//下一页分节符 builder.writeln("This is the 6th section,1nd Page"); builder.writeln("下一页分节符"); builder.insertBreak(BreakType.SECTION_BREAK_NEW_COLUMN);//节的结尾 builder.writeln("This is the 7th section,1nd Page"); builder.writeln("节的结尾"); doc.save(getTempFileName());
4.页面属性设置
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.write("Present Day,Present Life!Ahhhhhhh"); builder.getPageSetup().setPaperSize(PaperSize.A4);//纸张大小 builder.getPageSetup().setLeftMargin(20);//设置边距 单位为磅 builder.getPageSetup().setRightMargin(10); builder.getPageSetup().setTopMargin(10); builder.getPageSetup().setBottomMargin(10); builder.getPageSetup().setTextOrientation(TextOrientation.DOWNWARD);//文字方向 builder.getPageSetup().setOrientation(Orientation.LANDSCAPE);//横纵向 PORTRAIT 纵向 LANDSCAPE 横向 doc.save(getTempFileName());
5.设置页眉页脚
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.write("Hello,Lain!"); builder.insertBreak(BreakType.LINE_BREAK); builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY);//移动到页眉 builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); builder.writeln("Hello,Lain!"); builder.moveToDocumentEnd(); builder.writeln("Hello,Lain!"); builder.moveToHeaderFooter(HeaderFooterType.FOOTER_PRIMARY);//移动到页脚 builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); builder.getFont().setName("微软雅黑"); builder.write("第"); builder.insertField("PAGE", "");//当前页数 builder.write("页"); builder.write(" 共"); builder.insertField("NUMPAGES", "");//总页数 builder.write("页"); builder.moveToDocumentEnd(); builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); builder.write("Hello,Lain!"); doc.save(getTempFileName());
6.生成表格
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.startTable(); builder.insertCell(); builder.getCellFormat().setWidth(100); builder.getFont().setName("华文正楷"); builder.getFont().setColor(Color.decode("#66ccff")); builder.getParagraphFormat().setLineSpacing(24); builder.write("Name"); builder.insertCell(); builder.getCellFormat().setWidth(200); builder.write("describe"); builder.endRow(); builder.insertCell(); builder.getCellFormat().setWidth(100); builder.write("Lain"); builder.insertCell(); builder.getCellFormat().setWidth(200); builder.write("Make Me Sad"); builder.endRow(); builder.endTable(); doc.save(getTempFileName());
7.图片操作
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); builder.insertImage(image); doc.save(getTempFileName());
图片布满整个页面
private static void appendImg(DocumentBuilder builder, String imgPath) throws Exception { if (StringUtils.hasLength(imgPath)) { double pageHeight = builder.getPageSetup().getPageHeight(); double pageWidth = builder.getPageSetup().getPageWidth(); //先把页边距设为0,不知道为什么图片的大小总是减去页边距 double topMargin = builder.getPageSetup().getTopMargin(); double bottomMargin = builder.getPageSetup().getBottomMargin(); double leftMargin = builder.getPageSetup().getLeftMargin(); double rightMargin = builder.getPageSetup().getRightMargin(); builder.getPageSetup().setTopMargin(0); builder.getPageSetup().setBottomMargin(0); builder.getPageSetup().setLeftMargin(0); builder.getPageSetup().setRightMargin(0); builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 0.0D, RelativeVerticalPosition.PAGE, 0.0D, pageWidth, pageHeight, WrapType.NONE); builder.getPageSetup().setTopMargin(topMargin); builder.getPageSetup().setBottomMargin(bottomMargin); builder.getPageSetup().setLeftMargin(leftMargin); builder.getPageSetup().setRightMargin(rightMargin); } } //分页符 //builder.insertBreak(BreakType.PAGE_BREAK);
8.大纲目录
Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.insertTableOfContents("\\o \"1-9\" \\h \\z \\u");//参考微软官方office文档 builder.writeln(); builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_1); builder.writeln("一级"); builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_2); builder.writeln("二级"); builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); builder.getParagraphFormat().setOutlineLevel(OutlineLevel.LEVEL_3); builder.writeln("三级"); builder.getParagraphFormat().setOutlineLevel(OutlineLevel.BODY_TEXT); builder.writeln("正文"); doc.updateFields(); doc.save(getTempFileName());
9.合并文档
doc.appendDocument(new Document(), ImportFormatMode.KEEP_SOURCE_FORMATTING);
项目代码:
import java.awt.Color; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Consumer; import org.springframework.util.StringUtils; import com.aspose.words.BreakType; import com.aspose.words.Document; import com.aspose.words.DocumentBuilder; import com.aspose.words.ImportFormatMode; import com.aspose.words.License; import com.aspose.words.LineSpacingRule; import com.aspose.words.PaperSize; import com.aspose.words.ParagraphAlignment; import com.aspose.words.RelativeHorizontalPosition; import com.aspose.words.RelativeVerticalPosition; import com.aspose.words.Underline; import com.aspose.words.WrapType; import com.gdda.archives.platform.holdings.constant.subject.StyleLevelEnum; import cn.hutool.core.collection.CollUtil; public class AsposeWordEditor { static { try (InputStream is = AsposeWordEditor.class.getResourceAsStream("/license.xml")) { License aposeLic = new License(); aposeLic.setLicense(is); } catch (Exception e) { e.printStackTrace(); } } /** * 合并word并添加目录以及封面封底 * * @param param 参数 * @throws Exception 例外 */ public static void compilation(CompilationParam param) throws Exception { //样式 final Map<String, FontStyle> styleMap = param.getDocumentStyleMap(); //目录 final List<CatalogNode> catalogTree = param.getCatalogTree(); //封面路径 final String topPath = param.getTopPath(); //封底路径 final String bottomPath = param.getBottomPath(); //新建一个空文档 Document doc = new Document(); DocumentBuilder builder = new DocumentBuilder(doc); builder.getPageSetup().setPaperSize(PaperSize.A4); //1、封面 appendImg(builder, topPath); builder.insertBreak(BreakType.PAGE_BREAK); //2、目录 builder.moveToDocumentEnd(); setStyle(builder, styleMap.get(StyleLevelEnum.CATALOG.value())); //对齐 builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER); builder.writeln("目录"); setStyle(builder, null); //插入目录,这是固定的 builder.insertTableOfContents("\\o \"1-3\" \\h \\z \\u"); //3、内容 List<CatalogNode> blankHeading = new ArrayList<>(); catalogIteration(catalogTree, catalog -> { try { if (StringUtils.hasLength(catalog.getWordPath())) { Document nodes = new Document(catalog.getWordPath()); DocumentBuilder builder1 = new DocumentBuilder(nodes); builder1.moveToDocumentStart(); //连续标题 for (CatalogNode heading : blankHeading) { FontStyle style = styleMap.get(String.valueOf(heading.getLevel())); style = style == null ? styleMap.get(StyleLevelEnum.DEFAULT_HEADLINE) : style; setStyle(builder1, style); builder1.getParagraphFormat().setStyleIdentifier(heading.getLevel()); builder1.writeln(heading.getTitle()); } blankHeading.clear(); FontStyle style = styleMap.get(String.valueOf(catalog.getLevel())); style = style == null ? styleMap.get(StyleLevelEnum.DEFAULT_HEADLINE) : style; setStyle(builder1, style); builder1.getParagraphFormat().setStyleIdentifier(catalog.getLevel()); builder1.writeln(catalog.getTitle()); //添加文档 //清理一下样式,不然会影响到后续内容 setStyle(builder1, null); doc.appendDocument(nodes, ImportFormatMode.KEEP_SOURCE_FORMATTING); } else { blankHeading.add(catalog); } } catch (Exception e) { e.printStackTrace(); } }); //更新目录 doc.updateFields(); //4、封底 builder.moveToDocumentEnd(); builder.insertBreak(BreakType.PAGE_BREAK); appendImg(builder, bottomPath); //保存 doc.save(param.getOutPath()); } private static void setStyle(DocumentBuilder builder, FontStyle fontStyle) throws Exception { //清除样式 builder.getFont().clearFormatting(); builder.getParagraphFormat().clearFormatting(); if (fontStyle == null) { return; } //斜体 builder.setItalic(fontStyle.getItalic()); //加粗 builder.setBold(fontStyle.getBold()); //下划线 if (fontStyle.getUnderline()) { //单下划线 builder.setUnderline(Underline.SINGLE); } //字体 if (StringUtils.hasLength(fontStyle.getFontName())) { builder.getFont().setName(fontStyle.getFontName()); } //颜色 if (StringUtils.hasLength(fontStyle.getColor())) { Color color = Color.decode(fontStyle.getColor()); builder.getFont().setColor(color); } //大小 if (fontStyle.getFontSize() != null && fontStyle.getFontSize() > 0) { builder.getFont().setSize(fontStyle.getFontSize()); } //段前 if (fontStyle.getSpaceBefore() != null && fontStyle.getSpaceBefore() > 0) { builder.getParagraphFormat().setSpaceBefore(fontStyle.getSpaceBefore()); } //段后 if (fontStyle.getSpaceAfter() != null && fontStyle.getSpaceAfter() > 0) { builder.getParagraphFormat().setSpaceAfter(fontStyle.getSpaceAfter()); } //首行缩进 if (fontStyle.getFirstLineIndent() != null && fontStyle.getFirstLineIndent() > 0) { builder.getParagraphFormat().setFirstLineIndent(fontStyle.getFirstLineIndent()); } //行距 if (fontStyle.getLineSpacing() != null && fontStyle.getLineSpacing() > 0) { builder.getParagraphFormat().setLineSpacingRule(LineSpacingRule.EXACTLY); builder.getParagraphFormat().setLineSpacing(fontStyle.getLineSpacing()); } } private static void catalogIteration(List<CatalogNode> catalogTree, Consumer<CatalogNode> consumer) { for (CatalogNode e : catalogTree) { consumer.accept(e); List<CatalogNode> children = e.getChildren(); if (CollUtil.isNotEmpty(children)) { catalogIteration(children, consumer); } } } private static void appendImg(DocumentBuilder builder, String imgPath) throws Exception { if (StringUtils.hasLength(imgPath)) { double pageHeight = builder.getPageSetup().getPageHeight(); double pageWidth = builder.getPageSetup().getPageWidth(); //先把页边距设为0,不知道为什么图片的大小总是减去页边距 double topMargin = builder.getPageSetup().getTopMargin(); double bottomMargin = builder.getPageSetup().getBottomMargin(); double leftMargin = builder.getPageSetup().getLeftMargin(); double rightMargin = builder.getPageSetup().getRightMargin(); builder.getPageSetup().setTopMargin(0); builder.getPageSetup().setBottomMargin(0); builder.getPageSetup().setLeftMargin(0); builder.getPageSetup().setRightMargin(0); builder.insertImage(imgPath, RelativeHorizontalPosition.PAGE, 0.0D, RelativeVerticalPosition.PAGE, 0.0D, pageWidth, pageHeight, WrapType.NONE); builder.getPageSetup().setTopMargin(topMargin); builder.getPageSetup().setBottomMargin(bottomMargin); builder.getPageSetup().setLeftMargin(leftMargin); builder.getPageSetup().setRightMargin(rightMargin); } } }
------------ 就像竹林的灯火,被风吹过,摇摇曳曳,但永不熄灭! ------------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!