需求: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