使用POI导出Word(含表格)的实现方式及操作Word的工具类

您所在的位置:网站首页 poiword换行 使用POI导出Word(含表格)的实现方式及操作Word的工具类

使用POI导出Word(含表格)的实现方式及操作Word的工具类

2023-08-25 19:53| 来源: 网络整理| 查看: 265

使用POI导出Word(含表格)的实现方式及操作Word的工具类

转载请注明出处:https://www.cnblogs.com/sun-flower1314/p/10128796.html 

本篇是关于利用Apache 的POI导出Word的实现步骤。采用XWPFDocument导出Word,结构和样式完全由代码控制,操作起来还是非常的不太方便,只能够创建简单的word,不能设置样式,功能太少。但在这里还是实现一下,毕竟做过。

关于导出Word的方案另一种方式:https://www.cnblogs.com/sun-flower1314/p/10126111.html 

首先声明一些基本概念:

XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档 XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成 XWPFRun代表具有同样风格的一段文本 XWPFTable代表一个表格 XWPFTableRow代表表格的一行 XWPFTableCell代表表格的一个单元格 XWPFChar 表示.docx文件中的图表 XWPFHyperlink 表示超链接 XWPFPicture 代表图片

注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。

先看效果图:(完全是由代码导出)

 

1.导入jar包:

(虽然只有两个,但是会自动依赖其他jar包进来)

org.apache.poi poi-ooxml 3.17 org.apache.poi poi 3.17

 

  这是依赖包:

     

2. 代码部分:

package cn.hxc.myWorld.myWorld; import java.io.IOException; import java.util.List; 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.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; import cn.hxc.myWorld.util.XWPFHelper; import cn.hxc.myWorld.util.XWPFHelperTable; /** * @Description 导出word文档 * @Author Huangxiaocong * 2018年12月1日 下午12:12:15 */ public class ExportWord { private XWPFHelperTable xwpfHelperTable = null; private XWPFHelper xwpfHelper = null; public ExportWord() { xwpfHelperTable = new XWPFHelperTable(); xwpfHelper = new XWPFHelper(); } /** * 创建好文档的基本 标题,表格 段落等部分 * @return * @Author Huangxiaocong 2018年12月16日 */ public XWPFDocument createXWPFDocument() { XWPFDocument doc = new XWPFDocument(); createTitleParagraph(doc); createTableParagraph(doc, 10, 6); return doc; } /** * 创建表格的标题样式 * @param document * @Author Huangxiaocong 2018年12月16日 下午5:28:38 */ public void createTitleParagraph(XWPFDocument document) { XWPFParagraph titleParagraph = document.createParagraph(); //新建一个标题段落对象(就是一段文字) titleParagraph.setAlignment(ParagraphAlignment.CENTER);//样式居中 XWPFRun titleFun = titleParagraph.createRun(); //创建文本对象 // titleFun.setText(titleName); //设置标题的名字 titleFun.setBold(true); //加粗 titleFun.setColor("000000");//设置颜色 titleFun.setFontSize(25); //字体大小 // titleFun.setFontFamily("");//设置字体 //... titleFun.addBreak(); //换行 } /** * 设置表格 * @param document * @param rows * @param cols * @Author Huangxiaocong 2018年12月16日 */ public void createTableParagraph(XWPFDocument document, int rows, int cols) { // xwpfHelperTable.createTable(xdoc, rowSize, cellSize, isSetColWidth, colWidths) XWPFTable infoTable = document.createTable(rows, cols); xwpfHelperTable.setTableWidthAndHAlign(infoTable, "9072", STJc.CENTER); //合并表格 xwpfHelperTable.mergeCellsHorizontal(infoTable, 1, 1, 5); xwpfHelperTable.mergeCellsVertically(infoTable, 0, 3, 6); for(int col = 3; col < 7; col++) { xwpfHelperTable.mergeCellsHorizontal(infoTable, col, 1, 5); } //设置表格样式 List rowList = infoTable.getRows(); for(int i = 0; i < rowList.size(); i++) { XWPFTableRow infoTableRow = rowList.get(i); List cellList = infoTableRow.getTableCells(); for(int j = 0; j < cellList.size(); j++) { XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0); cellParagraph.setAlignment(ParagraphAlignment.CENTER); XWPFRun cellParagraphRun = cellParagraph.createRun(); cellParagraphRun.setFontSize(12); if(i % 2 != 0) { cellParagraphRun.setBold(true); } } } xwpfHelperTable.setTableHeight(infoTable, 560, STVerticalJc.CENTER); } /** * 往表格中填充数据 * @param dataList * @param document * @throws IOException * @Author Huangxiaocong 2018年12月16日 */ @SuppressWarnings("unchecked") public void exportCheckWord(Map dataList, XWPFDocument document, String savePath) throws IOException { XWPFParagraph paragraph = document.getParagraphArray(0); XWPFRun titleFun = paragraph.getRuns().get(0); titleFun.setText(String.valueOf(dataList.get("TITLE"))); List tableData = (List) dataList.get("TABLEDATA"); XWPFTable table = document.getTableArray(0); fillTableData(table, tableData); xwpfHelper.saveDocument(document, savePath); } /** * 往表格中填充数据 * @param table * @param tableData * @Author Huangxiaocong 2018年12月16日 */ public void fillTableData(XWPFTable table, List tableData) { List rowList = table.getRows(); for(int i = 0; i < tableData.size(); i++) { List list = tableData.get(i); List cellList = rowList.get(i).getTableCells(); for(int j = 0; j < list.size(); j++) { XWPFParagraph cellParagraph = cellList.get(j).getParagraphArray(0); XWPFRun cellParagraphRun = cellParagraph.getRuns().get(0); cellParagraphRun.setText(String.valueOf(list.get(j))); } } } }

   下面是用到的工具类:                                         

package cn.hxc.myWorld.util; import java.io.ByteArrayInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.TextAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFPicture; import org.apache.poi.xwpf.usermodel.XWPFPictureData; import org.apache.poi.xwpf.usermodel.XWPFRelation; 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.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule; import cn.hxc.myWorld.domain.ParagraphStyle; import cn.hxc.myWorld.domain.TextStyle; /** * @Description 设置docx文档的样式及一些操作 * @Author Huangxiaocong * 2018年12月1日 下午12:18:41 * 基本概念说明:XWPFDocument代表一个docx文档,其可以用来读docx文档,也可以用来写docx文档 * XWPFParagraph代表文档、表格、标题等种的段落,由多个XWPFRun组成 * XWPFRun代表具有同样风格的一段文本 * XWPFTable代表一个表格 * XWPFTableRow代表表格的一行 * XWPFTableCell代表表格的一个单元格 * XWPFChar 表示.docx文件中的图表 * XWPFHyperlink 表示超链接 * XWPFPicture 代表图片 * * 注意:直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun。 */ public class XWPFHelper { private static Logger logger = Logger.getLogger(XWPFHelper.class.toString()); /** * 创建一个word对象 * @return * @Author Huangxiaocong 2018年12月1日 上午11:56:35 */ public XWPFDocument createDocument() { XWPFDocument document = new XWPFDocument(); return document; } /** * 打开word文档 * @param path 文档所在路径 * @return * @throws IOException * @Author Huangxiaocong 2018年12月1日 下午12:30:07 */ public XWPFDocument openDoc(String path) throws IOException { InputStream is = new FileInputStream(path); return new XWPFDocument(is); } /** * 保存word文档 * @param document 文档对象 * @param savePath 保存路径 * @throws IOException * @Author Huangxiaocong 2018年12月1日 下午12:32:37 */ public void saveDocument(XWPFDocument document, String savePath) throws IOException { OutputStream os = new FileOutputStream(savePath); document.write(os); os.close(); } /** * 设置段落文本样式 设置超链接及样式 * @param paragraph * @param textStyle * @param url * @Author Huangxiaocong 2018年12月1日 下午3:56:32 */ public void addParagraphTextHyperlink(XWPFParagraph paragraph, TextStyle textStyle) { String id = paragraph.getDocument().getPackagePart(). addExternalRelationship(textStyle.getUrl(), XWPFRelation.HYPERLINK.getRelation()).getId(); //追加链接并将其绑定到关系中 CTHyperlink cLink = paragraph.getCTP().addNewHyperlink(); cLink.setId(id); //创建链接文本 CTText ctText = CTText.Factory.newInstance(); ctText.setStringValue(textStyle.getText()); CTR ctr = CTR.Factory.newInstance(); CTRPr rpr = ctr.addNewRPr(); //以下设置各种样式 详情看TextStyle类 if(textStyle.getFontFamily() != "" && textStyle.getFontFamily() != null ) { CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts(); fonts.setAscii(textStyle.getFontFamily()); //... } //设置字体大小 } /** * 设置段落的基本样式 设置段落间距信息, 一行 = 100 一磅=20 * @param paragraph * @param paragStyle * @Author Huangxiaocong 2018年12月1日 下午4:27:17 */ public void setParagraphSpacingInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle, STLineSpacingRule.Enum lineValue) { CTPPr pPPr = getParagraphCTPPr(paragraph); CTSpacing pSpacing = pPPr.getSpacing() != null ? pPPr.getSpacing() : pPPr.addNewSpacing(); if(paragStyle.isSpace()) { //段前磅数 if(paragStyle.getBefore() != null) { pSpacing.setBefore(new BigInteger(paragStyle.getBefore())); } //段后磅数 if(paragStyle.getAfter() != null) { pSpacing.setAfter(new BigInteger(paragStyle.getAfter())); } //依次设置段前行数、段后行数 //... } //间距 if(paragStyle.isLine()) { if(paragStyle.getLine() != null) { pSpacing.setLine(new BigInteger(paragStyle.getLine())); } if(lineValue != null) { pSpacing.setLineRule(lineValue); // } } } /** * 设置段落缩进信息 1厘米 约等于 567 * @param paragraph * @param paragStyle * @Author Huangxiaocong 2018年12月1日 下午7:59:35 */ public void setParagraphIndInfo(XWPFParagraph paragraph, ParagraphStyle paragStyle) { CTPPr pPPr = getParagraphCTPPr(paragraph); CTInd pInd = pPPr.getInd() != null ? pPPr.getInd() : pPPr.addNewInd(); if(paragStyle.getFirstLine() != null) { pInd.setFirstLine(new BigInteger(paragStyle.getFirstLine())); } //再进行其他设置 //... } /** * 设置段落对齐 方式 * @param paragraph * @param pAlign * @param valign * @Author Huangxiaocong 2018年12月1日 下午8:54:43 */ public void setParagraphAlignInfo(XWPFParagraph paragraph, ParagraphAlignment pAlign, TextAlignment valign) { if(pAlign != null) { paragraph.setAlignment(pAlign); } if(valign != null) { paragraph.setVerticalAlignment(valign); } } /** * 得到段落的CTPPr * @param paragraph * @return * @Author Huangxiaocong 2018年12月1日 下午7:36:10 */ public CTPPr getParagraphCTPPr(XWPFParagraph paragraph) { CTPPr pPPr = null; if(paragraph.getCTP() != null) { if(paragraph.getCTP().getPPr() != null) { pPPr = paragraph.getCTP().getPPr(); } else { pPPr = paragraph.getCTP().addNewPPr(); } } return pPPr; } /** * 得到XWPFRun的CTRPr * @param paragraph * @param pRun * @return * @Author Huangxiaocong 2018年12月1日 下午7:46:01 */ public CTRPr getRunCTRPr(XWPFParagraph paragraph, XWPFRun pRun) { CTRPr ctrPr = null; if(pRun.getCTR() != null) { ctrPr = pRun.getCTR().getRPr(); if(ctrPr == null) { ctrPr = pRun.getCTR().addNewRPr(); } } else { ctrPr = paragraph.getCTP().addNewR().addNewRPr(); } return ctrPr; } /** * 复制表格 * @param targetTable * @param sourceTable * @Author Huangxiaocong 2018年12月1日 下午1:40:01 */ public void copyTable(XWPFTable targetTable, XWPFTable sourceTable) { //复制表格属性 targetTable.getCTTbl().setTblPr(sourceTable.getCTTbl().getTblPr()); //复制行 for(int i = 0; i < sourceTable.getRows().size(); i++) { XWPFTableRow targetRow = targetTable.getRow(i); XWPFTableRow sourceRow = sourceTable.getRow(i); if(targetRow == null) { targetTable.addRow(sourceRow); } else { copyTableRow(targetRow, sourceRow); } } } /** * 复制单元格 * @param targetRow * @param sourceRow * @Author Huangxiaocong 2018年12月1日 下午1:33:22 */ public void copyTableRow(XWPFTableRow targetRow, XWPFTableRow sourceRow) { //复制样式 if(sourceRow != null) { targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr()); } //复制单元格 for(int i = 0; i < sourceRow.getTableCells().size(); i++) { XWPFTableCell tCell = targetRow.getCell(i); XWPFTableCell sCell = sourceRow.getCell(i); if(tCell == sCell) { tCell = targetRow.addNewTableCell(); } copyTableCell(tCell, sCell); } } /** * 复制单元格(列) 从sourceCell到targetCell * @param targetCell * @param sourceCell * @Author Huangxiaocong 2018年12月1日 下午1:27:38 */ public void copyTableCell(XWPFTableCell targetCell, XWPFTableCell sourceCell) { //表格属性 if(sourceCell.getCTTc() != null) { targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr()); } //删除段落 for(int pos = 0; pos < targetCell.getParagraphs().size(); pos++) { targetCell.removeParagraph(pos); } //添加段落 for(XWPFParagraph sourceParag : sourceCell.getParagraphs()) { XWPFParagraph targetParag = targetCell.addParagraph(); copyParagraph(targetParag, sourceParag); } } /** * 复制段落,从sourceParag到targetParag * @param targetParag * @param sourceParag * @Author Huangxiaocong 2018年12月1日 下午1:16:26 */ public void copyParagraph(XWPFParagraph targetParag, XWPFParagraph sourceParag) { targetParag.getCTP().setPPr(sourceParag.getCTP().getPPr()); //设置段落样式 //移除所有的run for(int pos = targetParag.getRuns().size() - 1; pos >= 0; pos-- ) { targetParag.removeRun(pos); } //copy新的run for(XWPFRun sRun : sourceParag.getRuns()) { XWPFRun tarRun = targetParag.createRun(); copyRun(tarRun, sRun); } } /** * 复制XWPFRun 从sourceRun到targetRun * @param targetRun * @param sourceRun * @Author Huangxiaocong 2018年12月1日 下午12:56:53 */ public void copyRun(XWPFRun targetRun, XWPFRun sourceRun) { //设置targetRun属性 targetRun.getCTR().setRPr(sourceRun.getCTR().getRPr()); targetRun.setText(sourceRun.text());//设置文本 //处理图片 List pictures = sourceRun.getEmbeddedPictures(); for(XWPFPicture picture : pictures) { try { copyPicture(targetRun, picture); } catch (InvalidFormatException e) { e.printStackTrace(); logger.log(Level.WARNING, "copyRun", e); } catch (IOException e) { e.printStackTrace(); logger.log(Level.WARNING, "copyRun", e); } } } /** * 复制图片从sourcePicture到 targetRun(XWPFPicture --> XWPFRun) * @param targetRun * @param source * @throws IOException * @throws InvalidFormatException * @Author Huangxiaocong 2018年12月1日 下午12:57:33 */ public void copyPicture(XWPFRun targetRun, XWPFPicture sourcePicture) throws InvalidFormatException, IOException { XWPFPictureData picData = sourcePicture.getPictureData(); String fileName = picData.getFileName(); //图片的名称 InputStream picInIsData = new ByteArrayInputStream(picData.getData()); int picType = picData.getPictureType(); int width = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCx(); int height = (int) sourcePicture.getCTPicture().getSpPr().getXfrm().getExt().getCy(); targetRun.addPicture(picInIsData, picType, fileName, width, height); // targetRun.addBreak();//分行 } }

 

    工具类二:    

package cn.hxc.myWorld.util; import java.math.BigInteger; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.poi.xwpf.usermodel.BodyElementType; import org.apache.poi.xwpf.usermodel.IBodyElement; 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.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGrid; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblGridCol; 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.CTTrPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc; /** * @Description 操作word的基本工具类 * 2018年12月3日 上午11:12:18 * @Author Huangxiaocong */ public class XWPFHelperTable { /** * 删除指定位置的表格,被删除表格后的索引位置 * @param document * @param pos * @Author Huangxiaocong 2018年12月1日 下午10:32:43 */ public void deleteTableByIndex(XWPFDocument document, int pos) { Iterator bodyElement = document.getBodyElementsIterator(); int eIndex = 0, tableIndex = -1; while(bodyElement.hasNext()) { IBodyElement element = bodyElement.next(); BodyElementType elementType = element.getElementType(); if(elementType == BodyElementType.TABLE) { tableIndex++; if(tableIndex == pos) { break; } } eIndex++; } document.removeBodyElement(eIndex); } /** * 获得指定位置的表格 * @param document * @param index * @return * @Author Huangxiaocong 2018年12月1日 下午10:34:14 */ public XWPFTable getTableByIndex(XWPFDocument document, int index) { List tableList = document.getTables(); if(tableList == null || index < 0 || index > tableList.size()) { return null; } return tableList.get(index); } /** * 得到表格的内容(第一次跨行单元格视为一个,第二次跳过跨行合并的单元格) * @param table * @return * @Author Huangxiaocong 2018年12月1日 下午10:46:41 */ public List getTableRConten(XWPFTable table) { List tableContextList = new ArrayList(); for(int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) { XWPFTableRow row = table.getRow(rowIndex); List cellContentList = new ArrayList(); for(int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++ ) { XWPFTableCell cell = row.getCell(colIndex); CTTc ctTc = cell.getCTTc(); if(ctTc.isSetTcPr()) { CTTcPr tcPr = ctTc.getTcPr(); if(tcPr.isSetHMerge()) { CTHMerge hMerge = tcPr.getHMerge(); if(STMerge.RESTART.equals(hMerge.getVal())) { cellContentList.add(getTableCellContent(cell)); } } else if(tcPr.isSetVMerge()) { CTVMerge vMerge = tcPr.getVMerge(); if(STMerge.RESTART.equals(vMerge.getVal())) { cellContentList.add(getTableCellContent(cell)); } } else { cellContentList.add(getTableCellContent(cell)); } } } tableContextList.add(cellContentList); } return tableContextList; } /** * 获得一个表格的单元格的内容 * @param cell * @return * @Author Huangxiaocong 2018年12月2日 下午7:39:23 */ public String getTableCellContent(XWPFTableCell cell) { StringBuffer sb = new StringBuffer(); List cellParagList = cell.getParagraphs(); if(cellParagList != null && cellParagList.size() > 0) { for(XWPFParagraph xwpfPr: cellParagList) { List runs = xwpfPr.getRuns(); if(runs != null && runs.size() > 0) { for(XWPFRun xwpfRun : runs) { sb.append(xwpfRun.getText(0)); } } } } return sb.toString(); } /** * 得到表格内容,合并后的单元格视为一个单元格 * @param table * @return * @Author Huangxiaocong 2018年12月2日 下午7:47:19 */ public List getTableContent(XWPFTable table) { List tableContentList = new ArrayList(); for (int rowIndex = 0, rowLen = table.getNumberOfRows(); rowIndex < rowLen; rowIndex++) { XWPFTableRow row = table.getRow(rowIndex); List cellContentList = new ArrayList(); for (int colIndex = 0, colLen = row.getTableCells().size(); colIndex < colLen; colIndex++) { XWPFTableCell cell = row.getCell(colIndex); cellContentList.add(getTableCellContent(cell)); } tableContentList.add(cellContentList); } return tableContentList; } /** * 跨列合并 * @param table * @param row 所合并的行 * @param fromCell 起始列 * @param toCell 终止列 * @Description * @Author Huangxiaocong 2018年11月26日 下午9:23:22 */ public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) { for(int cellIndex = fromCell; cellIndex


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3