asposeword實現doc模板操作-實例總結

項目中用到了根據模板生成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();
		}
	}

如有問題可以諮詢,寫的不周到還請包涵

不積跬步無以至千里,不積小流無以成江海;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章