`
53873039oycg
  • 浏览: 843702 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]poi word2007表格单元格合并

    博客分类:
  • poi
 
阅读更多

        代码参考了http://stackoverflow.com/questions/24907541/row-span-with-xwpftable,代码如下

       

import java.io.FileOutputStream;
import java.math.BigInteger;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
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.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
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;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;

public class POI_表格合并_S3_Test {
	public static void main(String[] args) throws Exception {
		POI_表格合并_S3_Test t=new POI_表格合并_S3_Test();
		XWPFDocument document = new XWPFDocument();
		t.megerTableCell(document);
		t.saveDocument(document, "f:/saveFile/temp/sys_"+ System.currentTimeMillis() + ".docx");
	}

	public void megerTableCell(XWPFDocument document) {
		XWPFTable table1 = document.createTable(6, 8); 
		setTableWidth(table1, "8000");
        fillTable(table1);
        mergeCellsVertically(table1, 1, 1,4);
        mergeCellsVertically(table1, 4, 2, 4);
        mergeCellsHorizontal(table1,0,3,5);
        mergeCellsHorizontal(table1,2,2,3);
        mergeCellsHorizontal(table1,2,6,7);
	}

	public  void fillTable(XWPFTable table) {
        for (int rowIndex = 0; rowIndex < table.getNumberOfRows(); rowIndex++) {
            XWPFTableRow row = table.getRow(rowIndex);
            row.setHeight(380);
            for (int colIndex = 0; colIndex < row.getTableCells().size(); colIndex++) {
                XWPFTableCell cell = row.getCell(colIndex);
                if(rowIndex%2==0){
                	 setCellText(cell, " cell " + rowIndex + colIndex + " ", "D4DBED", 1000);
                }else{
                	 setCellText(cell, " cell " + rowIndex + colIndex + " ", "AEDE72", 1000);
                }
            }
        }
    }
	
	public  void setCellText(XWPFTableCell cell,String text, String bgcolor, int width) {
		CTTc cttc = cell.getCTTc();
		CTTcPr cellPr = cttc.addNewTcPr();
		cellPr.addNewTcW().setW(BigInteger.valueOf(width));
		//cell.setColor(bgcolor);
		CTTcPr ctPr = cttc.addNewTcPr();
		CTShd ctshd = ctPr.addNewShd();
		ctshd.setFill(bgcolor);
		ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
		cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
		cell.setText(text);
	}
	

	/**
	 * @Description: 跨列合并
	 */
	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);
            }
        }
    }
	
	/**
	 * @Description: 跨行合并
	 * @see http://stackoverflow.com/questions/24907541/row-span-with-xwpftable
	 */
    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);
            }
        }
    }
    
	public void setTableWidth(XWPFTable table,String width){
		CTTbl ttbl = table.getCTTbl();
		CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl.getTblPr();
		CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr.addNewTblW();
		CTJc cTJc=tblPr.addNewJc();
		cTJc.setVal(STJc.Enum.forString("center"));
		tblWidth.setW(new BigInteger(width));
		tblWidth.setType(STTblWidth.DXA);
	}
	
	public void saveDocument(XWPFDocument document, String savePath)
			throws Exception {
		FileOutputStream fos = new FileOutputStream(savePath);
		document.write(fos);
		fos.close();
	}
}

   结果如下

  

 

   全文完

 

  • 大小: 52 KB
分享到:
评论
6 楼 lu438248129 2017-09-14  
楼主  为啥我用你的代码,跨列的合并没问题,但是跨行的合并有问题,例如第一行,第4,5,6列就无法合并?是用的poi版本的问题?
5 楼 h702109382 2017-08-30  
很好的资源,谢谢
4 楼 xiaolei1004 2016-10-28  
very good!!![b][/b]
3 楼 huanyue6660 2016-08-05  
拖动表格的时候列会还原,这是怎么回事?
2 楼 since2014 2015-04-21  
奥,我找到原因了,我使用wps打开就出现问题,用office打开就是正常的
1 楼 since2014 2015-04-21  
运行你上面的就能出来你图片中的表格?为什么我用你的代码出来的表格没有颜色,列宽也不正常?

相关推荐

    java poi 填充word(合并单元格,添加图片,设置字号)(csdn)————程序.pdf

    `mergeCells(cellStart, cellEnd)`函数执行实际的单元格合并。 5. **设置对齐方式和字体**: `builder.getParagraphFormat().setAlignment(ParagraphAlignment.LEFT)`将段落对齐方式设置为左对齐。`宋体;font-size...

    poi获取合并单元格

    ### POI 获取合并单元格详解 #### 一、概述 Apache POI 是一个流行的 Java 库,用于处理 Microsoft Office 格式的文档,如 Word、Excel 和 PowerPoint。在本篇文章中,我们将详细介绍如何使用 POI 处理 Excel 文件...

    POI操作Excel合并单元格边框问题解决方法

    POI操作Excel 合并单元格 边框问题解决方法,这个方法是我亲自测试,并运用于项目中的,可以放心使用,还一并写出了很多注释,其中有写poi的bug的解决方法

    poi读取合并单元格帮助类

    在Excel中,合并单元格是指将多个连续的单元格合并成一个单元格来显示数据。这在表格布局设计中非常有用,可以提高数据的可读性和美观性。然而,这对于数据处理来说是一个挑战,因为合并单元格实际上可能包含来自...

    poi生成Excel及合并单元格示例

    单元格合并是通过 `Sheet` 对象的 `mergeRegion` 方法实现的,该方法接受两个参数,分别表示要合并的区域的起始和结束单元格索引: ```java // 合并从第二列到第四列的单元格(索引从0开始) sheet.mergeRegions...

    POI合并多个相同的Excel或者合并Word文件

    总的来说,Java的POI库为我们提供了处理Microsoft Office文件的强大工具,无论是合并Excel还是Word文档,都能有效地完成任务。通过熟练掌握POI的使用,可以极大地提升工作效率,简化数据管理和文档处理的工作流程。

    poi将word转换成html、样式 表格 图片处理

    Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Word(.doc, .docx)、Excel(.xls, .xlsx)等。在本案例中,我们关注的是如何使用Apache POI将Word文档转换为HTML格式,并且保持原有的样式、表格...

    poi操作word表格

    在本主题中,我们将聚焦于如何使用Apache POI来操作Word文档中的表格。 在Word文档中,表格是一种常用的数据展示和组织方式。使用Apache POI,我们可以创建、修改、读取和格式化Word文档中的表格。以下是一些关键...

    java运用poi填充word数据并将多个word合并为一个

    本篇文章将详细讲解如何利用Apache POI库在Java中实现Word文档的数据填充以及多文件合并。 1. **Apache POI简介** Apache POI是一个开源项目,提供了一组API来处理Microsoft Office格式的文件,如DOCX(Word 2007...

    POI使用word模板文件循环输出行并导出word

    同时,如果模板中的表格结构复杂,可能需要对单元格的合并、列宽、行高等属性进行调整。 Apache POI提供了丰富的API,使得开发者可以灵活地操作Word文档,实现复杂的格式化和动态数据填充。通过熟练掌握这些API,...

    easyuiPoi导出Excel工具类封装(支持合并单元格)

    EasyUIPoI是一款基于Apache POI的Java工具库,专门用于简化Excel的导出操作,尤其在处理模板和合并单元格方面提供了便利。这个库主要适用于那些需要在Web应用中生成Excel报告或导出数据的场景,比如数据分析、报表...

    java使用poi操作.doc word模板替换,循环插入表格

    在实际应用中,你可能还需要处理更复杂的情况,比如样式设置、合并单元格、表格边框等。记得在完成操作后,你需要使用`document.write()`方法将修改后的文档保存到文件系统中。 在开发过程中,确保正确处理文件输入...

    java POI 导出复杂要求的表格

    同时,POI也支持合并单元格,这在创建标题或汇总行时非常有用。 在导出过程中,我们通常会将工作簿写入到一个`OutputStream`,如内存流或文件流。例如,我们可以使用`workbook.write(outputStream)`方法将工作簿...

    利用POI读取excel写入到word

    在实际应用中,你可能需要处理更复杂的情况,比如合并单元格、处理公式、格式转换等,这都需要对POI API有更深入的理解。同时,为了提高性能,可以考虑使用内存管理和流式处理策略,尤其是在处理大型文件时。

    Poi写Word工具类

    poi写word工具类,包括添加标题,插入表格,合并单元格,插入图片,自动生成目录;代码见 https://blog.csdn.net/zheng_chang_wei/article/details/89448055

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    1. 使用Apache POI的XWPF API读取Word文档,获取文档的文本、段落、表格等元素。 2. 创建一个Docx4j的WordprocessingMLPackage对象,加载POI解析出的Word文档内容。 3. 调用Docx4j的`WordprocessingMLPackage.toPDF...

    freemarker 导出word表格

    在本场景中,我们讨论的是如何利用FreeMarker来导出Word表格。这个过程通常涉及到以下步骤: 1. **创建Word模板**: 首先,你需要使用Microsoft Word创建所需的表格和格式。Word允许用户设计丰富的布局,包括...

    任免表(读取word表格里的的模板)

    在Apache POI中,处理Word表格主要涉及`XWPFDocument`和`XWPFTable`类。首先,你需要创建一个`XWPFDocument`对象来打开或创建Word文档。然后,你可以通过`getTables()`方法获取文档中的所有表格,并通过表格的索引来...

    poi 解析 office excel 2003,2007 word 2003,2007 的示例

    本示例将详细介绍如何使用Apache POI解析Office Excel 2003和2007,以及Word 2003和2007的文件。 首先,我们来看Excel的解析。Excel 2003使用的是.BOOK文件格式(HSSFWorkbook),而2007及以上版本使用的是.XLSX...

    Java通过POI读取Excel遍历数据,批量生成word文档

    使用POI的`XSSFWorkbook`类打开Excel文件,然后通过` XSSFSheet `获取工作表,并使用` XSSFRow `和` XSSFCell `遍历单元格数据: ```java import org.apache.poi.xssf.usermodel.*; // ... FileInputStream fis =...

Global site tag (gtag.js) - Google Analytics