項目中用到了根據模板生成word文件的功能,需要根據模板填充數據,這裏介紹一下使用到的asposeword的學習總結
一下根據實際開發展示如何應用
準備工作
項目使用spring boot進行maven依賴集成
jar包網盤提取:
鏈接:https://pan.baidu.com/s/1Vd_lZkfKh9Wt0Zk8urFqTQ
提取碼:57vx
<!-- 報表依賴 -->
<dependency>
<groupId>com.aspose-words</groupId>
<artifactId>aspose-words</artifactId>
<version>16.8.0</version>
</dependency>
resources下配置認證文件license.xml:
<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>
解決jar包由於maven倉庫中沒有源導致無法下載,需要手動添加問題:
1. 將依賴的jar包放置在本地磁盤中
2. 確認配置有maven環境並配置有本地倉庫,打開cmd
3. 執行以下命令(示例中jar包放置在F:盤符下)
mvn install:install-file -Dfile=F:\aspose-words-16.8.0-jdk16.jar -DgroupId=com.aspose-words -DartifactId=aspose-words -Dversion=16.8.0 -Dpackaging=jar
-Dfile的後面輸入的爲你下載的第三方jar包的本地文件路徑
-DgroupId的後面輸入的爲你轉maven jar包後groupId的標籤內容<groupId>QRCode</groupId>。
-DartifactId的後面輸入的爲你轉maven jar包後artifactId的標籤內<artifactId>QRCode</artifactId>
-Dversion的後面輸入的爲你轉maven jar包後version的標籤內容版本號<version>3.0</version>
4. 確認jar導入到本地倉庫,在項目中pom中添加依賴,根據上述的groupid等信息
工具類
AsposeWordUtil
public class AsposeWordUtil {
private Document doc;
private DocumentBuilder builder;
private InputStream doctemplate;
/**
* 根據模板文件創建對象
* @param tempfilepath 模板文件路徑
* @throws Exception
*/
public AsposeWordUtil(String tempfilepath) throws Exception{
// ClassLoader loader = Thread.currentThread().getContextClassLoader();
// String path = loader.getResource("asposeword/license.xml").getPath();
// if(path.startsWith("/")){
// path = path.substring(1);
// }
// //Linux 環境下添加此標識,Windows環境下刪除此標識
// path = "/"+path;
// InputStream license = new FileInputStream(path);
//以下爲認證文件license的存放位置
String fileName = "classpath:/asposeword/license.xml";
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource res = resourceLoader.getResource(fileName);
InputStream license = res.getInputStream();
License aposeLic = new License();
aposeLic.setLicense(license);
doctemplate = resourceLoader.getResource(tempfilepath).getInputStream();
doc = new Document(doctemplate);
builder = new DocumentBuilder(doc);
}
/**
* 插入書籤
* @param locationkey在某個書籤後插入
* @param key書籤名
* @param isnewline是否換行
* @throws Exception
*/
public void setBookmark(String locationkey,String key,boolean isnewline) throws Exception{
builder.moveToBookmark(locationkey);
if(isnewline) builder.writeln();
builder.startBookmark(key);
// builder.writeln(key);
builder.endBookmark(key);
}
/**
* 動態生成書籤
* @param key
* @throws Exception
*/
public void setBookmark(String key) throws Exception{
builder.writeln();
builder.startBookmark(key);
// builder.writeln(key);
builder.endBookmark(key);
}
/**
* 書籤填入內容
* @param key 書籤名稱
* @param value 填入值
* @throws Exception
*/
public void setBookmarksValue(String key,String value) throws Exception{
doc.getRange().getBookmarks().get(key).setText(value);
}
/**
* 多個書籤填入內容
* @param kvs 書籤名稱和填入值map
* @throws Exception
*/
public void setBookmarksValue(Map<String,String> kvs) throws Exception{
for(Map.Entry<String, String> entity:kvs.entrySet()){
setBookmarksValue(entity.getKey(),entity.getValue());
}
}
/**
* 插入另一個文檔的內容
* @param key 書籤位置
* @param out 圖片流
* @throws Exception
*/
public void setBookmarkDocument(String key,String filename) throws Exception{
Document doc1=new Document(ReportTemplate.getInstance().getReportTemplate(filename));
builder.moveToBookmark(key);
builder.insertDocument(doc1, ImportFormatMode.KEEP_DIFFERENT_STYLES);
}
/**
* 插入圖片
* @param key 書籤位置
* @param filePath 圖片文件路徑
* @throws Exception
*/
public void setBookmarkImage(String key,String filePath) throws Exception{
builder.moveToBookmark(key);
builder.insertImage(filePath);
}
/**
* 插入圖片
* @param key 書籤位置
* @param out 圖片流
* @throws Exception
*/
public void setBookmarkImage(String key,ByteArrayOutputStream out) throws Exception{
ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
builder.moveToBookmark(key);
builder.insertImage(swapStream);
}
/**
* 表格增加行
* @throws Exception
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public void table(List<ParagraphBean> pblist) throws Exception{
NodeCollection allTables = doc.getChildNodes(NodeType.TABLE, true); //獲取模板中的所有表格
Table table = (Table)allTables.get(0); //取到第一個表格
// 創建行
Row r = new Row(doc);
Cell c = new Cell(doc);
for(ParagraphBean pb:pblist){
if(pb.getType()==1){
//文本
Paragraph p = new Paragraph(doc);
Run run = new Run(doc,pb.getData().toString());
run.getFont().setSize(14);
p.appendChild(run);
if(pb.getAlignment()!=-1){
p.getParagraphFormat().setAlignment(pb.getAlignment());
}
c.appendChild(p);
}else if(pb.getType()==2){
Paragraph p = new Paragraph(doc);
//圖片
List<ByteArrayOutputStream> baos = (List<ByteArrayOutputStream>)pb.getData();
for(ByteArrayOutputStream bao:baos){
ByteArrayInputStream swapStream = new ByteArrayInputStream(bao.toByteArray());
/*
Shape shape=new Shape(doc,ShapeType.IMAGE);
shape.getImageData().setImage(swapStream);
//shape.setHeight(200);
*/
Shape shape = builder.insertImage(swapStream);
p.appendChild(shape);
}
c.appendChild(p);
}
}
r.getCells().add(c);
table.getRows().add(r);
}
/**
* 保存到內存流中
* @return
* @throws Exception
*/
public ByteArrayOutputStream save() throws Exception{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
doc.save(outputStream, SaveFormat.DOC);
return outputStream;
}
}
ParagraphBean
public class ParagraphBean {
private int type; // 類型【1:文本,2:圖片】
private int alignment; // 對齊方式
private Object data; // 數據
/**
* 初始化段
* @param type 類型【1:文本,2:圖片】
* @param data 數據
*/
public ParagraphBean(int type,Object data){
this.type=type;
this.data=data;
this.alignment=-1;
}
public ParagraphBean(int type,int alignment,Object data){
this.type=type;
this.alignment=alignment;
this.data=data;
}
/**
* 獲取數據類型
* @return 類型【1:文本,2:圖片】
*/
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getAlignment() {
return alignment;
}
public void setAlignment(int alignment) {
this.alignment = alignment;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
public class ReportFileCreate {
private static ReportFileCreate reportFileCreate;
public void init() {
reportFileCreate = this;
}
public static ReportFileCreate getInstance() {
return new ReportFileCreate();
}
public static AsposeWordUtil aspose;
/**
* 生成文件
* @throws Exception
*/
public String createDoc(Map<String, String> params) throws Exception {
aspose = new AsposeWordUtil("classpath:/asposeword/template/reply.dotx");
aspose.setBookmarksValue(params);
//DateUtil.getSdfTimesSS()獲取的是當前年月日時分秒的時間戳,20200501100155
String fileName = DateUtil.getSdfTimesSS() + ".doc";
boolean flag = aspose.save(fileName);
if(flag) {
return fileName;
} else {
return "";
}
}
}
開發應用
首先,創建word模板,這裏僅展示比較簡單的模板應用
插入書籤:name,age在各自的表格位置中 ,保存模板並將模板放置在項目resources/asposeword/temp下
生成文件下載
public void createFh(Map<String, Object> map) {
Map<String, String> params = new HashMap<String, String>();
params.put("name", "張三");
params.put("age", 18);
try {
fileName = ReportFileCreate.getInstance().createDoc(params);
/**
* 以下方式可以獲取到內存流中生成的文件,因博主實際應用中是將文件存儲到了ftp中,
* 非直接下載下來,所以各位根據示例需求完成下載操作吧
*/
File file = new File(fileName);
} catch (Exception e) {
e.printStackTrace();
}
}
如有問題可以諮詢,寫的不周到還請包涵
不積跬步無以至千里,不積小流無以成江海;