poi导出word表格跨行

Posted henuyuxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poi导出word表格跨行相关的知识,希望对你有一定的参考价值。

DataCommon.java

package com.ksource.pwlp.model.statistic;

public class DataCommon {

    private Long id;
    private String name;
    private String otherName;
    private String dataName;
    private String otherDataName;
    private int value;
    private float otherValue;
    private double othersValue;
    private String dataValue;
    private Long otherDataValue;
    private int oneResult;
    private int twoResult;
    private int threeResult;
    private int fourResult;
    private int fiveResult;
    private int sixResult;
    private float oneValue;
    private float twoValue;
    private float threeValue;
    private float fourValue;
    private float fiveValue;
    private float sixValue;
    private double oneVal;
    private double twoVal;
    private double threeVal;
    private double fourVal;
    private double fiveVal;
    private double sixVal;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getOtherName() {
        return otherName;
    }
    public void setOtherName(String otherName) {
        this.otherName = otherName;
    }
    public String getDataName() {
        return dataName;
    }
    public void setDataName(String dataName) {
        this.dataName = dataName;
    }
    public String getOtherDataName() {
        return otherDataName;
    }
    public void setOtherDataName(String otherDataName) {
        this.otherDataName = otherDataName;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public float getOtherValue() {
        return otherValue;
    }
    public void setOtherValue(float otherValue) {
        this.otherValue = otherValue;
    }
    public double getOthersValue() {
        return othersValue;
    }
    public void setOthersValue(double othersValue) {
        this.othersValue = othersValue;
    }
    public String getDataValue() {
        return dataValue;
    }
    public void setDataValue(String dataValue) {
        this.dataValue = dataValue;
    }
    public Long getOtherDataValue() {
        return otherDataValue;
    }
    public void setOtherDataValue(Long otherDataValue) {
        this.otherDataValue = otherDataValue;
    }
    public int getOneResult() {
        return oneResult;
    }
    public void setOneResult(int oneResult) {
        this.oneResult = oneResult;
    }
    public int getTwoResult() {
        return twoResult;
    }
    public void setTwoResult(int twoResult) {
        this.twoResult = twoResult;
    }
    public int getThreeResult() {
        return threeResult;
    }
    public void setThreeResult(int threeResult) {
        this.threeResult = threeResult;
    }
    public int getFourResult() {
        return fourResult;
    }
    public void setFourResult(int fourResult) {
        this.fourResult = fourResult;
    }
    public int getFiveResult() {
        return fiveResult;
    }
    public void setFiveResult(int fiveResult) {
        this.fiveResult = fiveResult;
    }
    public int getSixResult() {
        return sixResult;
    }
    public void setSixResult(int sixResult) {
        this.sixResult = sixResult;
    }
    public float getOneValue() {
        return oneValue;
    }
    public void setOneValue(float oneValue) {
        this.oneValue = oneValue;
    }
    public float getTwoValue() {
        return twoValue;
    }
    public void setTwoValue(float twoValue) {
        this.twoValue = twoValue;
    }
    public float getThreeValue() {
        return threeValue;
    }
    public void setThreeValue(float threeValue) {
        this.threeValue = threeValue;
    }
    public float getFourValue() {
        return fourValue;
    }
    public void setFourValue(float fourValue) {
        this.fourValue = fourValue;
    }
    public float getFiveValue() {
        return fiveValue;
    }
    public void setFiveValue(float fiveValue) {
        this.fiveValue = fiveValue;
    }
    public float getSixValue() {
        return sixValue;
    }
    public void setSixValue(float sixValue) {
        this.sixValue = sixValue;
    }
    public double getOneVal() {
        return oneVal;
    }
    public void setOneVal(double oneVal) {
        this.oneVal = oneVal;
    }
    public double getTwoVal() {
        return twoVal;
    }
    public void setTwoVal(double twoVal) {
        this.twoVal = twoVal;
    }
    public double getThreeVal() {
        return threeVal;
    }
    public void setThreeVal(double threeVal) {
        this.threeVal = threeVal;
    }
    public double getFourVal() {
        return fourVal;
    }
    public void setFourVal(double fourVal) {
        this.fourVal = fourVal;
    }
    public double getFiveVal() {
        return fiveVal;
    }
    public void setFiveVal(double fiveVal) {
        this.fiveVal = fiveVal;
    }
    public double getSixVal() {
        return sixVal;
    }
    public void setSixVal(double sixVal) {
        this.sixVal = sixVal;
    }
}

调用导出word表格代码如下:

List<DataCommon> dataCommonList = new ArrayList<DataCommon>(); //数据是从数据库查出来取需要字段的值存入DataCommon中后存到dataCommonList中

  dataCommon.setName("类别列的值");
  dataCommon.setOtherName("证据名称的值");
  dataCommonList.add(dataCommon);

 //dataCommonList中存的值有一定规律,相同类别的是紧邻挨着的

String savePath = this.attachPath + File.separator + ContextUtil.getCurrentUser().getAccount() + "\\" + System.currentTimeMillis() + ".docx";
new CreateTable().createSimpleTable(dataCommonList,savePath);

导出word表格方法如下:

package com.ksource.pwlp.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.List;
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.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;

import com.ksource.core.util.ContextUtil;
import com.ksource.pwlp.model.statistic.DataCommon;

/**
 * 创建证据材料清单表格
 * @author dxy
 *
 */
public class CreateTable {

    public void createSimpleTable(List<DataCommon> dataCommonList, String savePath) throws Exception {
        String orgName = ContextUtil.getCurrentOrg().getOrgName();
        XWPFDocument xdoc = new XWPFDocument();
        XWPFParagraph xp = xdoc.createParagraph();
        xp.setSpacingBefore(0);
        XWPFRun r1 = xp.createRun();
        XWPFRun r2 = xp.createRun();
        r1.setText(orgName);
        r1.setFontFamily("宋体");
        r1.setFontSize(18);
        r1.addBreak(); // 换行
        r2.setText("证据清单");
        r2.setFontFamily("宋体");
        r2.setFontSize(22);
        r2.setTextPosition(10);
        r2.setBold(true);
        r2.addBreak(); // 换行
        xp.setAlignment(ParagraphAlignment.CENTER);

        Integer col_total_count = 4; // 表格最多的列数

        XWPFTable xTable = xdoc.createTable(1, col_total_count);

        CTTbl ttbl = xTable.getCTTbl();
        CTTblPr tblPr = ttbl.getTblPr() == null ? ttbl.addNewTblPr() : ttbl
                .getTblPr();
        CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr
                .addNewTblW();
        tblWidth.setW(new BigInteger("8600"));
        tblWidth.setType(STTblWidth.DXA);

        // 创建表头数据
        int i = 0;
        xTable.getRow(i).setHeight(500);
        setCellText(xdoc, xTable.getRow(i).getCell(0), "序号", "FFFFFF", getCellWidth(0));
        setCellText(xdoc, xTable.getRow(i).getCell(1), "类别", "FFFFFF", getCellWidth(1));
        setCellText(xdoc, xTable.getRow(i).getCell(2), "证据名称", "FFFFFF", getCellWidth(2));
        setCellText(xdoc, xTable.getRow(i).getCell(3), "备注", "FFFFFF", getCellWidth(3));

        // 创建表格内容
        i++;
        String preGroupName = "";
        String groupName = "";
        int flag = 0;
        int num = 1;
        for (int i2 = i; i2 < dataCommonList.size()+1; i2++) {
            XWPFTableRow row = xTable.insertNewTableRow(i2);
            row.setHeight(450);
            for (int j = 0, j2 = 0; j < col_total_count; j++, j2++) {
                XWPFTableCell cell = row.createCell();
                CTTc cttc = cell.getCTTc();
                CTTcPr cellPr = cttc.addNewTcPr();
                cellPr.addNewVAlign().setVal(STVerticalJc.CENTER);
                cttc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
                cellPr.addNewTcW().setW(BigInteger.valueOf(getCellWidth(j2)));
                
                if (j == 0) { 
                    if(preGroupName.equals(groupName)){
                        cell.setText(String.valueOf(num));
                    }else{
                        cell.setText(String.valueOf(++num));
                    }
                }
                if (j == 1) { 
                    cell.setText(dataCommonList.get(i2-1).getName());
                    if(i2 > 1){
                        preGroupName = dataCommonList.get(i2-2).getName();
                    }
                    groupName = dataCommonList.get(i2-1).getName();
                }
                if (j == 2) { 
                    cell.setText(dataCommonList.get(i2-1).getOtherName());
                }
                if (j == 3) {
                    cell.setText("");
                }
            }
            
            if(preGroupName.equals(groupName) && !"".equals(groupName)){
                flag++;
                if(i2 == dataCommonList.size()){
                    mergeCellsVertically(xTable, 0, i2-flag, i2);
                    mergeCellsVertically(xTable, 1, i2-flag, i2);
                    flag = 0;
                }
            }else{
                if(flag > 0){
                    if(i2 < dataCommonList.size()){
                        if(i2 > 1 && !"".equals(preGroupName)){
                            mergeCellsVertically(xTable, 0, i2-1-flag, i2-1);
                            mergeCellsVertically(xTable, 1, i2-1-flag, i2-1);
                            flag = 0;
                        }
                    }
                    if(i2 == dataCommonList.size()){
                        mergeCellsVertically(xTable, 0, i2-1-flag, i2-1);
                        mergeCellsVertically(xTable, 1, i2-1-flag, i2-1);
                        flag = 0;
                    }
                }
            }
        }
        
        FileOutputStream fos = new FileOutputStream(savePath);
        xdoc.write(fos);
        fos.close();
    }

    /**
     * 设置表头内容
     * @param xDocument
     * @param cell
     * @param text
     * @param bgcolor
     * @param width
     */
    private static void setCellText(XWPFDocument xdoc, XWPFTableCell cell,
            String text, String bgcolor, int width) {
        CTTc cttc = cell.getCTTc();
        CTTcPr cellPr = cttc.addNewTcPr();
        cellPr.addNewTcW().setW(BigInteger.valueOf(width));
        XWPFParagraph paragraph = cell.getParagraphs().get(0);
        paragraph.setAlignment(ParagraphAlignment.CENTER); //设置表头单元格居中
        XWPFRun run  = paragraph.createRun();
        run.setFontFamily("仿宋_GB2312");
        run.setFontSize(16); //设置表头单元格字号
        //run.setBold(true); //设置表头单元格加粗
        run.setText(text);
    }

    /**
     * 设置列宽
     * 
     * @param index
     * @return
     */
    private static int getCellWidth(int index) {
        int cwidth = 1000;
        if (index == 0) {
            cwidth = 1000;
        } else if (index == 1) {
            cwidth = 2100;
        } else if (index == 2) {
            cwidth = 3200;
        } else if (index == 3) {
            cwidth = 2100;
        }
        return cwidth;
    }

    /**
     * 跨行合并
     * 
     * @param table
     * @param col
     * @param fromRow
     * @param toRow
     */
    public static 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);
            }
        }
    }
    
    /**
     * 将文件转换成byte数组
     * @param filePath
     * @return
     */
    public byte[] fileToByte(File file){
        byte[] buffer = null;
        try
        {
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] b = new byte[1024];
            int n;
            while ((n = fis.read(b)) != -1)
            {
                bos.write(b, 0, n);
            }
            fis.close();
            bos.close();
            buffer = bos.toByteArray();
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        return buffer;
    }
}

导出效果图如下:

技术图片

以上是关于poi导出word表格跨行的主要内容,如果未能解决你的问题,请参考以下文章

POI跨行导出excell表格实现.md

java poi xwpf操作word生成一个表格怎么合并单元格,求大神指导!

java用poi导出word文档,我要导出一个表格,表格的单元格中还要有一个表格,请问怎么实现

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

easypoi导出word表格怎么遍历数据

poi 导出word,导出表格(复杂表格合并行列)解决方法