Aspose.Word使用说明文档
使用说明文档
一、前言
一、前言
刘志昂 2019/2/22
Aspose.Word是一款相当成熟的Word处理组件,使用他可以像真正在使用office一样,在代码里编辑Word文档,而且不需要在本
地安装Office支持。
二、构建文档
二、构建文档
1.快速上手
快速上手
Aspose.Word是一款商业软件(以下简称Aspose),因此在使用Aspose前,要先获得license授权。
为了方便演示,我们先定义一个注册方法。
private static final String LIC = "...";//license授权文本
public static void registeLicense()
{
InputStream licenseStream = new ByteArrayInputStream(LIC.getBytes());
License license = new License();
try
{
license.setLicense(licenseStream);//加载license
} catch (Exception e)
{
e.printStackTrace();
}
}
让我们从创建一个Word文档开始吧!
/**
* 使用Apsose.Word创建第一个Word文档
*/
@Test
public void test1()
{
registeLicense();
try
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.writeln("Hello,Lain!");
doc.save(getTempFileName());//文件保存位置,会根据后缀名自动判断保存类型
} catch (Exception e)
{
e.printStackTrace();
}
}
这里的 DocumentBuilder 可以理解为你在office里编辑时的光标,实际上它内部确实维护了一个游标。
writeln 方法和 write 方法的区别在于, writeln 在文本之后插入了一个段落终止符,相当于如下代码:
builder.write("Hello,Lain!");
builder.insertBreak(BreakType.PARAGRAPH_BREAK);
打开生成的文件,可以看到我们刚刚输入的文字。
在一切开始之前,建议先阅读一下这篇文章,对Aspose的文档模型有一个整体的了解:
http://w w w.cnblogs.com/asxinyu/p/3242754.html
2.为段落设置格式
为段落设置格式
话不多说,先上代码。
/**
* 为段落设置格式
*/
@Test
public void test2()
{
registeLicense();
try
{
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 从右向左 false 从左向右
builder.writeln("Present Day,Present Time!Ahhhhhhh");
doc.save(getTempFileName());
} catch (Exception e)
{
e.printStackTrace();
}
}
打开你的Office Word,或WPS,右键点击 段落 ,你所能看到的所有设置在上面的代码中都能实现。
3.页面分隔
页面分隔
Word之中分页和分节看上去像是同样的效果,但实际上两者是完全不一样的,分页符只是将内容分割到下一页,但还是在同一节
里面。对页面进行设置,比如横纵向,页面大小等,都是对分节进行设置的,而不能单独对某一页。
让我们看Aspose中如何对文档设置分页分节:
/**
* 页面分隔符
*/
@Test
public void test3()
{
registeLicense();
try
{
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());
} catch (Exception e)
{
e.printStackTrace();
}
}
可以看到,囊括了Word中所有相关的操作:
4.页面设置
页面设置
下面的代码演示了如何对页面属性进行设置
/**
* 页面设置
*/
@Test
public void test4()
{
registeLicense();
try
{
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());
} catch (Exception e)
{
e.printStackTrace();
}
}
对应的office中的功能:
5.设置页眉页脚
设置页眉页脚
/**
* 设置页眉页脚
*/
@Test
public void test5()
{
registeLicense();
try
{
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());
} catch (Exception e)
{
e.printStackTrace();
}
}
由Aspose的文档模型结构可知,页眉页脚是在section里面,和body并列,并不在正文中,所以在设置页眉页脚的时候要
先 moveToHeaderFooter ,写完内容后,再移到文档末尾 moveToDocumentEnd 。
在页眉中写内容,和在正文中一样,可以设置文字格式,颜色,等。
6.生成表格
生成表格
//表格
@Test
public void test6()
{
registeLicense();
Document doc;
try
{
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());
} catch (Exception e)
{
e.printStackTrace();
}
}
使用 Builder 插入表格,先 startTable ,然后插入单元格,使用 endRow 结束一行。可以通过 CellFormat 设置单元格格式,写入文
本时依旧可以设置段落格式以及文本样式。最后使用 endTable 结束一张表格的编写。
当有两张表格在一起的时候,注意中间要用换行符隔开,不然两个表格会合并为一个
7.插入图片
插入图片
/**
* 插入图片
*/
@Test
public void test9()
{
BufferedImage image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
image.getGraphics().drawString("Hello,Lain!", 120, 120);
registeLicense();
try
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
builder.insertImage(image);
doc.save(getTempFileName());
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
对段落设置居中,对图片同样有效
8.大纲级别
大纲级别 /导航导航 /生成目录
生成目录
@Test
public void test8()
{
registeLicense();
try
{
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());
} catch (Exception e)
{
e.printStackTrace();
}
}
Word中插入目录,实际上也是插入的域代码, insertTableOfContents ,插入的是TOC,具体参数设置,可以参考Office官方文
档:
https://support.office.com/zh-cn/article/域代码:toc(目录)域-1f538bc4-60e6-4854-9f64-67754d78d05c?ui=zh-CN&rs=zh-
CN&ad=CN
三、从网页构建文档
三、从网页构建文档
Aspose有一特色功能,能够将html页面转换为Word文档输出。
使用起来也很方便:
@Test
public void test10()
{
String html = "
";//Html内容
registeLicense();
try
{
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
builder.insertHtml(html);
doc.save(getTempFileName());
} catch (Exception e)
{
e.printStackTrace();
}
}
在实际生活中,我们可以发现,有的时候复制网页上的内容,会把网页上的样式也一并复制过来,在粘贴的时候会有保留原格式
的选项,可以看出Word实际上就是用超文本标记语言实现的,因此能有这样的功能也不奇怪。
但也不是所有样式都能被顺利转换,就我们实际项目来说,目前发现的就有上下标不识别,横线不识别等。要想用这个功能进行
开发,得先把想要的doc样式用Aspose转换成Html,然后再转换回来看一下,如果能正确转换,就去生成的Html里找生效的元素。