最近需要在word中绘制表格,绘制完成后发现 wps不支持poi的跨列合并,百度没有找到好的解决办法。自己在office中把文档转换为doc格式之后发现wps可以正常显示word中的表格了,同时之前微信预览不到表格的问题也解决了。
poi版本为3.17 以下是跨列以及跨行合并代码 之前网上搜到的 忘记原作者是哪位大佬了
maven
org.apache.poi
poi
3.14
org.apache.poi
poi-scratchpad
3.14
org.apache.poi
poi-ooxml
3.14
org.apache.poi
poi-ooxml-schemas
3.14
org.apache.poi
ooxml-schemas
1.3
// word跨列合并单元格
public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
if (cellIndex == fromCell) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}
}
}
// word跨行并单元格
public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
if (rowIndex == fromRow) {
// The first merged cell is set with RESTART merge value
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
} else {
// Cells which join (merge) the first one, are set with CONTINUE
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
}
}
docx转doc用的是aspose-words-jdk16.jar 这个jar包全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换 且linux和windiws下均可使用。效率也很高。比之前使用的jacob要好用很多,以下是调用方法十分简单
/**
* word转pdf 需引入 aspose-words-16.4.0-jdk16.jar包 收费插件windows linux下均可用
*
* @param inPath 源文件路径
* @param outPath 输出文件路径
*/
public static void docx2pdf(String inPath, String outPath) {
//jar包为破解版 不用进行验证
/*
if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
return;
}*/
try {
File file = new File(outPath); // 新建一个空白pdf文档
FileOutputStream os = new FileOutputStream(file);
com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* docx转doc 需引入 aspose-words-16.4.0-jdk16.jar包 收费插件windows linux下均可用
*
* wps不兼容docx的表格跨列合并,微信文件预览不支持docx下的表格
* 转换为doc格式的可以被wps兼容 微信可预览表格
*
* @param inPath 源文件路径
* @param outPath 输出文件路径
*/
public static void docx2doc(String inPath, String outPath) {
try {
File file = new File(outPath); // 新建一个空白pdf文档
FileOutputStream os = new FileOutputStream(file);
com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
doc.save(os, SaveFormat.DOC);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
} catch (Exception e) {
e.printStackTrace();
}
}
这个是aspose的下载地址 应该是破解版本 转换之后没有发现水印 下载后防止maven对应目录下 或者直接把jar包放入工程内
aspose下载地址
com.aspose.words
aspose-words-jdk16