Android實現word模板套打功能

需求:Android打印固定格式的表單。

過程:製作word模板,進行數據填充,打印輸出。

步驟一

製作word模板

遇到問題:直接使用word編輯好的模板會導致打印出來後,部分佔位符未被替換。因爲word保存時會將佔位符的標籤分割,如下圖:

應修正爲

具體步驟爲:將編輯好的文檔“現場檢查筆錄.docx”,保存爲“現場檢查筆錄.xml”,使用notepad++打開後,進行修正,當然notepad++需要安裝xml tool插件進行格式調整。修正後保存爲“現場檢查筆錄.docx”。模板即完成。

打印輸出代碼如下:

private void initData(InspectionBean.RowsBean bean) {
        Map<String, Object> map = new HashMap<String, Object>();

        if(null != bean){

            map.put("$checkTimeStart$", bean.getCheckTimeStart()==null ?"":bean.getCheckTimeStart().substring(0,bean.getCheckTimeStart().indexOf(".")));
            map.put("$checkTimeEnd$", bean.getCheckTimeEnd()==null ?"":bean.getCheckTimeEnd().substring(0,bean.getCheckTimeEnd().indexOf(".")));
            map.put("$inspectedAdd$", bean.getInspectedAdd());
            map.put("$inspectUnitName$", bean.getInspectUnitName() + bean.getInspectedUnitOther());
            map.put("$inspectedUnitName$", bean.getInspectedUnitName() + bean.getInspectedUnitOther());
            map.put("$inspection$", bean.getOnsiteInspection());
            LogUtils.i(TAG,"onsiteInspection="+bean.getOnsiteInspection());
        }


        try {
            //讀取示例文書
            docName = "現場檢查筆錄.docx";
            InputStream is = getAssets().open(docName);
            //讀取段落(一般段落,頁眉頁腳沒辦法讀取)
            //自定義的XWPFDocument,解決官方版圖片不顯示問題
            CustomXWPFDocument document = new CustomXWPFDocument(is);
            List<XWPFParagraph> listParagraphs = document.getParagraphs();
            processParagraphs(listParagraphs, map);

            //讀取頁腳
//            List<XWPFFooter> footerList = document.getFooterList();
//            processParagraph(footerList, map);
            ToastUtils.makeText(InspectionPrintActivity.this, "開始打印", Toast.LENGTH_SHORT).show();
            //處理表格
            Iterator<XWPFTable> it = document.getTablesIterator();
            while (it.hasNext()) {//循環操作表格
                XWPFTable table = it.next();
                List<XWPFTableRow> rows = table.getRows();
                for (XWPFTableRow row : rows) {//取得表格的行
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {//取得單元格
/*                        if ("$IMG$".equals(cell.getText())) {
                            //直接插入圖片會在文檔的最底端,所以要插在固定位置,要把圖片放在表格裏
                            //所以使用判斷單元格,並清除單元格放置圖片的方式來實現圖片定位
                            cell.removeParagraph(0);
                            XWPFParagraph pargraph = cell.addParagraph();
                            document.addPictureData(getAssets().open("1.png"), XWPFDocument.PICTURE_TYPE_PNG);
                            document.createPicture(document.getAllPictures().size() - 1, 120, 120, pargraph);
                        }*/
                        List<XWPFParagraph> paragraphListTable = cell.getParagraphs();
                        processParagraphs(paragraphListTable, map);
                    }
                }
            }
            FileOutputStream fopts = new FileOutputStream(newPath);
            document.write(fopts);
            //打印
            doMopriaPrint("/storage/emulated/0/現場檢查筆錄.docx");

            if (fopts != null) {
                fopts.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //處理頁腳中的段落,其實就是用方法讀取了下頁腳中的內容,然後也會當做一般段落處理
    private void processParagraph(List<XWPFFooter> footerList, Map<String, Object> map) {
        if (footerList != null && footerList.size() > 0) {
            for (XWPFFooter footer : footerList) {
                //讀取一般段落
                List<XWPFParagraph> paragraphs = footer.getParagraphs();
                processParagraphs(paragraphs, map);
                //處理表格
                List<XWPFTable> tables = footer.getTables();
                for (int i = 0; i < tables.size(); i++) {
                    XWPFTable xwpfTable = tables.get(i);
                    List<XWPFTableRow> rows = xwpfTable.getRows();
                    for (XWPFTableRow row : rows) {//取得表格的行
                        List<XWPFTableCell> cells = row.getTableCells();
                        for (XWPFTableCell cell : cells) {//取得單元格
                            List<XWPFParagraph> paragraphListTable = cell.getParagraphs();
                            processParagraphs(paragraphListTable, map);
                        }
                    }
                }
            }
        }
    }

    //處理段落
    public static void processParagraphs(List<XWPFParagraph> paragraphList, Map<String, Object> param) {
        if (paragraphList != null && paragraphList.size() > 0) {
            for (XWPFParagraph paragraph : paragraphList) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
//                    Log.i("text",text);
                    if (text != null) {
                        boolean isSetText = false;
                        for (Map.Entry<String, Object> entry : param.entrySet()) {
                            String key = entry.getKey();
                            if (text.indexOf(key) != -1) {
                                isSetText = true;
                                Object value = entry.getValue();
                                if (value instanceof String) {//文本替換
                                    text = text.replace(key, value.toString());
                                }
                            }
                        }
                        if (isSetText) {
                            run.setText(text, 0);
                        }
                    }
                }
            }
        }
    }

輸出word文檔已保存在手機內部存儲 

/storage/emulated/0/現場檢查筆錄.docx

如需打印直接手機連上藍牙或WiFi打印機即可。

用到的poi:

    provided files('libs/poi-3.9-20121203.jar')
    provided files('libs/poi-ooxml-schemas-3.9-20121203.jar')
    provided files('libs/poi-ooxml-3.9-20121203.jar')
    provided files('libs/xmlbeans-2.3.0.jar')
    provided files('libs/dom4j-1.6.1.jar')

    provided files('libs/org.apache.poi.xwpf.converter.core-1.0.0.jar')
    provided files('libs/org.apache.poi.xwpf.converter.xhtml-1.0.2.jar')

Demo地址:https://download.csdn.net/download/shuimu_88/11251521

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