2 java1349033501 java1349033501 于 2017.09.02 17:55 提问

poi给word的表格添加新的一行并添加数据,怎么所有的数据都挤在一行啊

public void newRow(XWPFDocument document,int number,List list) throws Exception{
//获取所有表格

List tables = document.getTables();

//这里简单取第一个表格

XWPFTable table = tables.get(number);

    //获取表头
    XWPFTableRow header = table.getRow(1); 

    for (int h = 1 ; h <= list.size() ; h++) {
        //添加新的一行  
        //第一个参数是新增行的样式,在原表中取XWPFTableRow header = table.getRow(1);  
        //第二个参数是表示插入到第几行
        table.addRow(header,h);
        }

    List<XWPFTableRow> rows = table.getRows();
    System.out.println("list数量"+rows.size());


    for(int i = 0; i < list.size();i++){

// XWPFTableRow row = table.getRow(i+1);
String[] string = list.get(i);
for(int j = 0 ;j < string.length;j++){
System.out.println("行"+rows.get(i+2).getCell(j).getText());
// rows.get(i+2).getCell(j).setText(string[j]);

                rows.get(i+2).getTableCells().get(j).setText(string[j]);
            }
    }
}

3个回答

devmiao
devmiao   Ds   Rxr 2017.09.02 23:47
java1349033501
java1349033501 没用啊 代码运行后没有新增一行表格
11 个月之前 回复
HBCDKXL
HBCDKXL   2017.11.22 15:42

解决问题了吗 老哥 我也遇到了这个问题

tangcaijun
tangcaijun   2018.07.04 10:14

赋值行时使用以下 copyTableRow 方法。

直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。

/**
 * 
 * 复制RUN,从source到target
 * @param target
 * @param source
 * 
 */
public void copyRun(XWPFRun target, XWPFRun source) {
    // 设置run属性
    target.getCTR().setRPr(source.getCTR().getRPr());
    // 设置文本
    target.setText(source.text());
    // 处理图片
    List<XWPFPicture> pictures = source.getEmbeddedPictures();

    for (XWPFPicture picture : pictures) {
        try {
            copyPicture(target, picture);
        } catch (InvalidFormatException e) {
            logger.error("copyRun", e);
        } catch (IOException e) {
            logger.error("copyRun", e);
        }
    }
}

/**
 * 
 * 复制图片到target
 * @param target
 * @param picture
 * @throws IOException
 * @throws InvalidFormatException
 * 
 */
public void copyPicture(XWPFRun target, XWPFPicture picture)throws IOException, InvalidFormatException {

    String filename = picture.getPictureData().getFileName();
    InputStream pictureData = new ByteArrayInputStream(picture
            .getPictureData().getData());
    int pictureType = picture.getPictureData().getPictureType();
    int width = (int) picture.getCTPicture().getSpPr().getXfrm().getExt()
            .getCx();

    int height = (int) picture.getCTPicture().getSpPr().getXfrm().getExt()
            .getCy();

    // target.addBreak();
    target.addPicture(pictureData, pictureType, filename, width, height);
    // target.addBreak(BreakType.PAGE);
}

/**
 * 复制段落,从source到target
 * @param target
 * @param source
 * 
 */
public void copyParagraph(XWPFParagraph target, XWPFParagraph source) {

    // 设置段落样式
    target.getCTP().setPPr(source.getCTP().getPPr());

    // 移除所有的run
    for (int pos = target.getRuns().size() - 1; pos >= 0; pos--) {
        target.removeRun(pos);
    }

    // copy 新的run
    for (XWPFRun s : source.getRuns()) {
        XWPFRun targetrun = target.createRun();
        copyRun(targetrun, s);
    }

}

/**
 * 复制单元格,从source到target
 * @param target
 * @param source
 * 
 */
public void copyTableCell(XWPFTableCell target, XWPFTableCell source) {
    // 列属性
    if (source.getCTTc() != null) {
        target.getCTTc().setTcPr(source.getCTTc().getTcPr());
    }
    // 删除段落
    for (int pos = 0; pos < target.getParagraphs().size(); pos++) {
        target.removeParagraph(pos);
    }
    // 添加段落
    for (XWPFParagraph sp : source.getParagraphs()) {
        XWPFParagraph targetP = target.addParagraph();
        copyParagraph(targetP, sp);
    }
}

/**
 * 
 * 复制行,从source到target
 * @param target
 * @param source
 * 
 */
public void copyTableRow(XWPFTableRow target, XWPFTableRow source) {
    // 复制样式
    if (source.getCtRow() != null) {
        target.getCtRow().setTrPr(source.getCtRow().getTrPr());
    }
    // 复制单元格
    for (int i = 0; i < source.getTableCells().size(); i++) {
        XWPFTableCell cell1 = target.getCell(i);
        XWPFTableCell cell2 = source.getCell(i);
        if (cell1 == null) {
            cell1 = target.addNewTableCell();
        }
        copyTableCell(cell1, cell2);
    }
}
  /**
   * 复制表,从source到target
   * @param target
   * @param source
   */
  public void copyTable(XWPFTable target, XWPFTable source) {
    // 表格属性
    target.getCTTbl().setTblPr(source.getCTTbl().getTblPr());

    // 复制行
    for (int i = 0; i < source.getRows().size(); i++) {
      XWPFTableRow row1 = target.getRow(i);
      XWPFTableRow row2 = source.getRow(i);
      if (row1 == null) {
        target.addRow(row2);
      } else {
        copyTableRow(row1, row2);
      }
    }
  }

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
POI实现插入行
最近用POI实现根据模板导出excel,需要从中间行插入查询到的数据但是用creatRow生成的数据会覆盖后面的模板内容查了API没有找到插入行的方法不过找到shiftRows方法将最后的空行移到需要插入行的位置,再用createRow生成sheet.shiftRows(insertRowNum, sheet.getLastRowNum(), 1,true,false); sheet.create
使用POI给word中的表格增加行
需求:有一个给定的word文档,文档中有一个表格,该表格只有一个标题行。现在根据数据为表格增加行,并保留表格线条。 如下表格所示: 字段1 字段2 字段3 字段4 字段5 字段6 修改后的效果: 字段1 字段2 字段3 字段4 字段5 字段6 ... ... ... ... ... ... ... ..
用javascript实现在表格中添加新行的同时添加内容
function tableAddRow(obj) { var newTr = document.getElementById(obj).insertRow(); //插入新行 var newTd0 = newTr.insertCell(); //为行插入单元格 var newTd1 = newTr.insertCell(); var newTd2 = newTr.inser
用ajax向table插一条一条数据,使插入最新数据都在第一行
首先我的布局是这样的: ajax是这样的: 这样就能实现每次ajax返回最新的一条数据都会在table的第一行显示。
POI 从控制台读取表格每行信息,通过POI向word写入表格
别人博客里有个表格 如下: 三、 直接标志转移 指令格式                 机器码                    测试条件                       如...则转移   JC                           72                           C=1
MySQL:向已有数据表中插入新的一列数据
一、需求 有两个表格,test和test2如下所示: mysql&amp;gt; select * from test; +------+------+------------+ | data | id | timestamp | +------+------+------------+ | 300 | 3 | 1536292800 | | 200 | 2 | 1536292...
给Dataset增加行数据
给Dataset增加行数据 1,先实例化一个新的Dataset DataSet DM = new DataSet(); 2,再实例化一个DataTable  DataTable Dtt = new DataTable(); 3,给DataTable添加表名    Dtt.TableName = "Pages"; 4,把D
关于POI XWPFTable 里面的添加行方法
 insertNewTableRow    这个方法的方法体是空的,所以实现不了添加行的方法。api里面也说了,可能以后不实现就废除。public void addRow(XWPFTableRow row){} 这个方法我也测了一波,发现也没成功,不过我不敢确定方法体是不是空的。public boolean addRow(XWPFTableRow row,int pos){}     这个同上p...
POI ,Java 操作 Excel 实现行的插入(insert row)
POI ,Java 操作 Excel 实现行的插入(insert row)前几天,正在做一个项目,主要用 POI 来操作 Excel 其中,要使用一个,插入功能。主要是因为从数据库,返回结果集(数据明细),来动态车生成新行,插入明细在网上找了找,没有找到,好的方法自己写了一个:  public static void insertRow(HSSFWorkbook wb, HSS
Layui给数据表格动态添加一行并跳转到添加行所在页
Layui数据表格动态添加一行问题 Layui是一个前端 UI 框架,该框架风格优雅,但由于发布时间较短,很多功能并没有提供实现。 笔者在使用Layui的数据表格的时候,需求是这样的:当点击添加按钮的时候,就在数据表格最后动态添加一行。上述功能官方并没有给出实现,需要自己手动解决。 解决思路及方案 简单分析:根据需求——动态添加一行,首先想到的是利用JS/jQuery操作DOM对象实