1. 程式人生 > >安卓使用POI讀取及修改Word文件(.doc格式)

安卓使用POI讀取及修改Word文件(.doc格式)

前言:如果你可愛的專案經理要求安卓端的你來操作word實現各種功能,不要猶豫,直接動之以情曉之以理,因為這本來就是java的poi,安卓雖然源自java,但對於java的很多東西是不支援的,已有的各種jar包也不方便更改,各種報錯會搞的你腦闊疼。所以編輯word文件這種事讓後臺來做要比安卓來做簡單的多,但如果實在避免不了,接著,給你程式碼。

說明:本篇不支援word2007版,只支援2003版,也就是隻支援.doc格式,不支援.docx格式。.doc格式的word文件是不支援圖片插入的,因為.doc格式和.docx格式有很大的區別,用到的jar包和方法也不同,如果需要插入圖片,請檢視下篇對.docx格式word文件的處理。

1.製作文書

製作.doc格式的文件,然後匯入專案

文章展示的文件內容如下

2.導包

用到java poi-3.9中的兩個包,完整壓縮包點這裡下載。然後複製用來編輯.doc文件的兩個依賴包,匯入libs目錄。

如果提示報錯,是因為jar中有重複檔案,請看build配置。

3.加入外部儲存讀寫許可權,M以後還需要自行申請,程式碼中有體現

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

4.讀寫過程直接上程式碼了,一看就懂

    Button go;
    //生成檔案的所在的地址
    private static final String newPath = "/storage/emulated/0/hwpfdocument.doc";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        go = (Button) findViewById(R.id.go);
        go.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                readWord();
            }
        });
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
        }
    }

    private void readWord() {
        try {
            //從assets讀取我們的Word模板
            InputStream is = getAssets().open("hwpfdocument.doc");
            //建立生成的檔案路徑
            File newFile = new File(newPath);
            //需要修改的欄位放入map中
            Map<String, String> map = new HashMap<String, String>();
            map.put("${TITLE}", "標題");
            map.put("${TXT}", "表格第一行");
            map.put("${CONTENT}", "內容");
            writeDoc(is, newFile, map);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void writeDoc(InputStream is, File newFile, Map<String, String> map) {
        try {
            //使用poi的HWPFDocument方法
            HWPFDocument hdt = new HWPFDocument(is);
            //Range讀取word文字內容
            Range range = hdt.getOverallRange();
            //replaceText替換文字內容
            for (Map.Entry<String, String> entry : map.entrySet()) {
                range.replaceText(entry.getKey(), entry.getValue());
            }
            ByteArrayOutputStream ostream = new ByteArrayOutputStream();
            FileOutputStream out = new FileOutputStream(newFile, true);
            hdt.write(ostream);
            //輸出位元組流
            out.write(ostream.toByteArray());
            out.close();
            ostream.close();
            Toast.makeText(this, "文書已生成", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

5.效果展示

6.附錄

關於Apache POI - HWPF和XWPF的說明可以參考這裡

關於HWPF的API可以參考這裡。左上角選擇org.apache.poi.hwpf,然後左下角選擇hwpfdocument即可。

7.原始碼

點我下載