PoiDemo【Android將表單數據生成Word文檔的方案之二(基於Poi4.0.0)】

版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!html

前言

使用Poi實現android中根據模板文件生成Word文檔的功能。這裏的模板文件是doc文件。若是模板文件是docx文件的話,請閱讀下一篇文章《PoiDocxDemo【Android將表單數據生成Word文檔的方案之二(基於Poi4.0.0),目前只能java生成】java

注意:linux

  • POI 4.0.0 is the first release to require Java 8 or newer.

前期準備

一、下載poi相關jar包

官網下載地址:http://poi.apache.org/download.htmlandroid

若是windows系統,則下載zip文件;若是是linux系統則選擇.tar.gz。git

將下載後的壓縮包解壓,會獲得如下文件。github

文件(夾)名 做用
docs 文檔(包括API文檔和如何使用及版本信息)
lib doc功能實現依賴的包
ooxml-lib docx功能實現依賴的包
LICENSE  
NOTICE  
poi-4.0.0.jar 基礎類
poi-examples-4.0.0.jar 不明確,不知道什麼做用
poi-excelant-4.0.0.jar excel功能實現
poi-ooxml-4.0.0.jar docx功能實現
poi-ooxml-schemas-4.0.0.jar docx功能實現相關類
poi-scratchpad-4.0.0.jar doc功能實現

 

二、製做docx模板或者doc模板文件

代碼分析

一、能夠看到doc和docx文件分別對應着組件HWPF和XWPF,而HWPF和XWPF則對應着poi-scratchpad和poi-ooxml。apache

官網地址:http://poi.apache.org/components/index.htmlwindows

使用步驟

1、項目組織結構圖

注意事項:api

一、  導入類文件後須要change包名以及從新import R文件路徑app

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋

2、導入步驟

一、將poi相關jar文件導入項目中(Demo採用的是module方式)

引用jar文件參考《【Android Studio安裝部署系列】十7、Android studio引用第三方庫、jar、so、arr文件

注意:

解析doc文件,須要引用下面的jar文件:

  • poi-4.0.0.jar
  • poi-scratchpad-4.0.0.jar
  • libs目錄下的commons-collections4-4.2.jar

 

二、在poilib和app的build.gradle文件中添加如下代碼

poilib

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28



    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //poi compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //Poi=doc api files('libs/poi-4.0.0.jar') api files('libs/poi-scratchpad-4.0.0.jar') api files('libs/commons-collections4-4.2.jar')
}

app

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.why.project.poidemo"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //poi compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    //poi implementation project(':poilib')
}

三、在poilib這個module中添加PoiUtils.java文件

四、將模板文件複製到項目的assets目錄下

3、使用方法

一、根據doc模板生成doc文件的關鍵代碼

MainActivity.java

package com.why.project.poidemo;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.why.project.poilib.PoiUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;

        //利用doc模板生成doc文件
        findViewById(R.id.btn_poi_doc).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try { InputStream templetDocStream = getAssets().open("請假單模板2.doc"); String targetDocPath = mContext.getExternalFilesDir("poi").getPath() + File.separator + "請假單2.doc";//這個目錄,不須要申請存儲權限
 Map<String, String> dataMap = new HashMap<String, String>(); dataMap.put("$writeDate$", "2018年10月14日"); dataMap.put("$name$", "HaiyuKing"); dataMap.put("$dept$", "移動開發組"); dataMap.put("$leaveType$", "☑倒休 √年假 ✔事假 ☐病假 ☐婚假 ☐產假 ☐其餘"); dataMap.put("$leaveReason$", "倒休一天。"); dataMap.put("$leaveStartDate$", "2018年10月14日上午"); dataMap.put("$leaveEndDate$", "2018年10月14日下午"); dataMap.put("$leaveDay$", "1"); dataMap.put("$leaveLeader$", "贊成"); dataMap.put("$leaveDeptLeaderImg$", "贊成!"); PoiUtils.writeToDoc(templetDocStream,targetDocPath,dataMap); } catch (IOException e) { e.printStackTrace(); }

            }
        });
    }
}

 

 PoiUtils.java

package com.why.project.poidemo.poi;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * Created by HaiyuKing
 * Used poi工具類封裝
 * 在使用POI寫word doc文件的時候咱們必需要先有一個doc文件才行,由於咱們在寫doc文件的時候是經過HWPFDocument來寫的,
 * 而HWPFDocument是要依附於一個doc文件的。因此一般的作法是咱們先在硬盤上準備好一個內容空白的doc文件,而後創建一個基於該空白文件的HWPFDocument。
 * 以後咱們就能夠往HWPFDocument裏面新增內容了,而後再把它寫入到另一個doc文件中,這樣就至關於咱們使用POI生成了word doc文件。
 */
public class PoiUtils {

    /**
     * 生成一個doc文件
     * @param templetDocPath  模板文件的完整路徑
     * @param targetDocPath 生成的目標文件的完整路徑
     * @param dataMap 替換的數據*/
    public static void writeToDoc(String templetDocPath, String targetDocPath, Map<String,String> dataMap){
        try
        {
            //獲得模板doc文件的HWPFDocument對象
            InputStream in = new FileInputStream(templetDocPath);
            writeToDoc(in,targetDocPath,dataMap);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 生成一個doc文件,主要用於直接讀取asset目錄下的模板文件,不用先複製到sd卡中
     * @param templetDocInStream  模板文件的InputStream
     * @param targetDocPath 生成的目標文件的完整路徑
     * @param dataMap 替換的數據*/
    public static void writeToDoc(InputStream templetDocInStream, String targetDocPath, Map<String,String> dataMap){
        try
        {
            //獲得模板doc文件的HWPFDocument對象
            HWPFDocument HDoc = new HWPFDocument(templetDocInStream); // 獲取word文本內容,整個文本
            Range range = HDoc.getRange(); // 替換文本內容,將自定義的$xxx$替換成實際文本
            for(Map.Entry<String, String> entry : dataMap.entrySet()) { range.replaceText(entry.getKey(), entry.getValue()); } //寫到另外一個文件中
            FileOutputStream out = new FileOutputStream(targetDocPath, true); //把doc輸出到輸出流中
 HDoc.write(out); out.close(); templetDocInStream.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

}

二、效果

生成的文件路徑:內部存儲——Android——data——com.why.project.poidemo——files——poi——請假單2.doc

混淆配置

參考資料

Android使用ApachePOI組件讀寫Worddoc和docx文件

Poi官網

Android中使用POI加載與顯示word文檔

poi替換模板標籤爲圖片

POI用addPicture插入圖片到word裏面沒法顯示

使用POI讀寫Word doc文件

Android中使用POI加載與顯示word文檔

項目demo下載地址

https://github.com/haiyuKing/PoiDemo

相關文章
相關標籤/搜索