安卓使用POI讀取及修改Word文件(.doc格式)
阿新 • • 發佈:2019-02-12
前言:如果你可愛的專案經理要求安卓端的你來操作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.原始碼
點我下載。