package com.xiruibin; import java.io.FileOutputStream; import java.math.BigInteger; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; public final class Word2007 { /** * 生成word,表格 * * @param data * @throws Exception */ public static void productWordForm(Map<String, String> tableinfo, Map<String, LinkedHashMap<String, LinkedHashMap<String, String>>> data, Parameters parameters) throws Exception { XWPFDocument xDocument = new XWPFDocument(); Iterator<String> tableNameIter = data.keySet().iterator(); while (tableNameIter.hasNext()) { String table_name = tableNameIter.next(); XWPFParagraph xp = xDocument.createParagraph(); XWPFRun r1 = xp.createRun(); r1.setText(table_name + " " + tableinfo.get(table_name)); r1.setFontSize(18); r1.setTextPosition(10); XWPFParagraph p = xDocument.createParagraph(); p.setAlignment(ParagraphAlignment.CENTER); p.setWordWrap(true); LinkedHashMap<String, LinkedHashMap<String, String>> columns = data.get(table_name); int rows = columns.size(); XWPFTable xTable = xDocument.createTable(rows + 1, 7); //表格属性 CTTblPr tablePr = xTable.getCTTbl().addNewTblPr(); //表格宽度 CTTblWidth width = tablePr.addNewTblW(); width.setW(BigInteger.valueOf(8600)); int i = 0; xTable.getRow(i).setHeight(380); setCellText(xDocument, xTable.getRow(i).getCell(0), "代码", "CCCCCC", getCellWidth(0)); setCellText(xDocument, xTable.getRow(i).getCell(1), "注释", "CCCCCC", getCellWidth(1)); setCellText(xDocument, xTable.getRow(i).getCell(2), "类型", "CCCCCC", getCellWidth(2)); setCellText(xDocument, xTable.getRow(i).getCell(3), "默认值", "CCCCCC", getCellWidth(3)); setCellText(xDocument, xTable.getRow(i).getCell(4), "标识", "CCCCCC", getCellWidth(4)); setCellText(xDocument, xTable.getRow(i).getCell(5), "主键", "CCCCCC", getCellWidth(5)); setCellText(xDocument, xTable.getRow(i).getCell(6), "空值", "CCCCCC", getCellWidth(6)); i = i + 1;// 下一行 int j = 0;// 列column索引 Map<String, LinkedHashMap<String, String>> keyColumnMap = keyColumns(columns); for (Iterator<String> columnNameIter = keyColumnMap.keySet().iterator(); columnNameIter.hasNext();) { String column_name = columnNameIter.next(); LinkedHashMap<String, String> columnsAtt = keyColumnMap.get(column_name); int cwidth = getCellWidth(j); setCellText(xDocument, xTable.getRow(i).getCell(j), column_name, "FFFFFF", cwidth); ++j; Iterator<String> columnTypeIter = columnsAtt.keySet().iterator(); while (columnTypeIter.hasNext()) { String colum_type = columnTypeIter.next(); cwidth = getCellWidth(j); setCellText(xDocument, xTable.getRow(i).getCell(j),columnsAtt.get(colum_type), "FFFFFF", cwidth); j++; } ++i;// 下一行 j = 0;// 恢复第一列 } Iterator<String> cloumnsNameIter = columns.keySet().iterator(); while (cloumnsNameIter.hasNext()) { xTable.getRow(i).setHeight(380); String colum_name = cloumnsNameIter.next(); LinkedHashMap<String, String> columnsAtt = columns.get(colum_name); int cwidth = getCellWidth(j); if (xTable.getRow(i) == null) continue; setCellText(xDocument, xTable.getRow(i).getCell(j),colum_name, "FFFFFF", cwidth); j++; Iterator<String> columnTypeIter = columnsAtt.keySet().iterator(); while (columnTypeIter.hasNext()) { String colum_type = columnTypeIter.next(); cwidth = getCellWidth(j); setCellText(xDocument, xTable.getRow(i).getCell(j),columnsAtt.get(colum_type), "FFFFFF", cwidth); j++; } j = 0;// 恢复第一列 ++i; //下一行 } XWPFTableRow row = xTable.insertNewTableRow(0); row.setHeight(380); row.addNewTableCell(); CTTcPr cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(1600)); row.getCell(0).setColor("CCCCCC"); row.getCell(0).setText("中文名称"); row.addNewTableCell(); cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(3000)); row.getCell(1).setColor("FFFFFF"); row.getCell(1).setText(tableinfo.get(table_name)); row.addNewTableCell(); cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(1200)); row.getCell(2).setColor("CCCCCC"); row.getCell(2).setText("英文名称"); row.addNewTableCell(); CTTc cttc = row.getCell(3).getCTTc(); CTTcPr ctPr = cttc.addNewTcPr(); cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(2800)); ctPr.addNewGridSpan().setVal(BigInteger.valueOf(4)); ctPr.addNewHMerge().setVal(STMerge.CONTINUE); cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER); cttc.getPList().get(0).addNewR().addNewT().setStringValue(table_name); row = xTable.insertNewTableRow(1); row.setHeight(380); row.addNewTableCell(); cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(1600)); row.getCell(0).setColor("CCCCCC"); row.getCell(0).setText("功能描述"); row.addNewTableCell(); cellPr = row.getCell(0).getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(7000)); cttc = row.getCell(1).getCTTc(); ctPr = cttc.addNewTcPr(); ctPr.addNewGridSpan().setVal(BigInteger.valueOf(6)); ctPr.addNewHMerge().setVal(STMerge.CONTINUE); cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.LEFT); cttc.getPList().get(0).addNewR().addNewT().setStringValue(""); } FileOutputStream fos = new FileOutputStream(parameters.getPath() + parameters.getDatabase() + "_doc.docx"); xDocument.write(fos); fos.close(); } private static void spanCellsAcrossRow(XWPFTable table, int rowNum, int colNum, int span) throws Exception { try { XWPFTableCell cell = table.getRow(rowNum).getCell(colNum); if (cell.getCTTc().getTcPr() != null) { cell.getCTTc().getTcPr().addNewGridSpan(); if (cell.getCTTc().getTcPr().getGridSpan() == null) { cell.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf((long)span)); } } } catch (Exception e) { throw e; } } private static void setCellText(XWPFDocument xDocument, XWPFTableCell cell, String text, String bgcolor, int width) { CTTcPr cellPr = cell.getCTTc().addNewTcPr(); cellPr.addNewTcW().setW(BigInteger.valueOf(width)); cell.setColor(bgcolor); cell.setVerticalAlignment(XWPFVertAlign.CENTER); cell.setText(text); } /** * 检索出主键key相关的列 * * @param columnsMap * @return */ private static Map<String, LinkedHashMap<String, String>> keyColumns(HashMap<String, LinkedHashMap<String, String>> columnsMap) { Map<String, LinkedHashMap<String, String>> keyColumnMap = new HashMap<String, LinkedHashMap<String, String>>(); Iterator<String> cloumnsNameIter = columnsMap.keySet().iterator(); while (cloumnsNameIter.hasNext()) { String colum_name = cloumnsNameIter.next(); LinkedHashMap<String, String> columnsAtt = columnsMap.get(colum_name); if (columnsAtt.get("column_key").equals("是")) { keyColumnMap.put(colum_name, columnsAtt); cloumnsNameIter.remove(); } } return keyColumnMap; } private static int getCellWidth(int index) { int cwidth = 1000; if (index==0) { cwidth = 1600; } else if (index==1) { cwidth = 3000; } else if (index==2) { cwidth = 1200; } else if (index==3) { cwidth = 900; } else if (index==4) { cwidth = 600; } else if (index==5) { cwidth = 600; } else if (index==6) { cwidth = 700; } return cwidth; } }