Excel Apache POI 在执行 setCellValue() 时仅打印最后一个元素

Posted

技术标签:

【中文标题】Excel Apache POI 在执行 setCellValue() 时仅打印最后一个元素【英文标题】:Excel Apache POI is printing only last element while performing setCellValue() 【发布时间】:2018-12-07 22:07:59 【问题描述】:

我正在从 excel 中读取一些数据并以列的形式将其写入同一文件中的另一张表,并且我希望将列打印在行中。当我执行迭代时 createRow().setCellValue() 只打印最后一个元素。

package com.editDistance;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadColumnsEditDistance 

	public static void main(String[] args) throws IOException 
		// TODO Auto-generated method stub

		File src = new File("C:\\Users\\xyz\\Desktop\\folder\\file.xlsx");
		FileInputStream file = new FileInputStream(src);
		Workbook workbook = new XSSFWorkbook(file);
		Sheet sheet1 = workbook.getSheetAt(0);
		int rows = sheet1.getPhysicalNumberOfRows();
		workbook.createSheet();
		Sheet sheet2 = workbook.getSheetAt(1);
		for (int Readingrowindex = 1; Readingrowindex < rows; Readingrowindex++) 

			String ah = sheet1.getRow(Readingrowindex).getCell(1).getStringCellValue();
			sheet2.createRow(Readingrowindex).createCell(0).setCellValue(ah);
			sheet2.createRow(0).createCell(Readingrowindex).setCellValue(ah);

		

		FileOutputStream fout = new FileOutputStream(src);
		workbook.write(fout);
	

【问题讨论】:

【参考方案1】:

您想在第一列和第一行创建具有相同单元格的工作表,例如命名表吗?如果是,你需要修改你的代码,因为你总是重写第一行,这就是为什么你只得到最后一项。这样做:

    File src = new File("C:\\Users\\xyz\\Desktop\\folder\\file.xlsx");
    FileInputStream file = new FileInputStream(src);
    Workbook workbook = new XSSFWorkbook(file);
    Sheet sheet1 = workbook.getSheetAt(0);
    int rows = sheet1.getPhysicalNumberOfRows();
    workbook.createSheet();
    Sheet sheet2 = workbook.getSheetAt(1);
    Row sheet2FirstRow = sheet2.createRow(0);
    for (int Readingrowindex = 1; Readingrowindex < rows; Readingrowindex++) 

        String ah = sheet1.getRow(Readingrowindex).getCell(1).getStringCellValue();
        sheet2.createRow(Readingrowindex).createCell(0).setCellValue(ah);
        Cell cell = sheet2FirstRow.createCell(Readingrowindex);
        cell.setCellValue((String) ah);

    

    FileOutputStream fout = new FileOutputStream(src);
    workbook.write(fout);

【讨论】:

【参考方案2】:

我认为这是因为您一遍又一遍地创建第 0 行,所以它会覆盖您已经创建的内容。

你可能想做这样的事情:

if(sheet2.getRow() == null)
    sheet2.createRow(0).createCell(Readingrowindex).setCellValue(ah);
else
    sheet2.getRow(0).createCell(Readingrowindex).setCellValue(ah);

【讨论】:

应该在循环本身然后如何避免 getRow() 不能为空【参考方案3】:

我在写入代码时遇到了类似的问题(它只打印最后一行)。

这是我的代码的解决方案:

失败的解决方案(仅打印最后一个单元格)即“Hello3”

                    sheet.createRow(8).createCell(0).setCellValue("Hello1");
                    sheet.createRow(8).createCell(1).setCellValue("Hello2");
                    sheet.createRow(8).createCell(2).setCellValue("Hello3");

工作解决方案(打印所有数据):

        XSSFRow row;
        row = sheet.createRow(8);
        row.createCell(0).setCellValue("India 123");
        row.createCell(1).setCellValue("India 234");
        row.createCell(2).setCellValue("India 3453");

        row = sheet.createRow(9);
        row.createCell(0).setCellValue("Test 123");
        row.createCell(1).setCellValue("Test 234");
        row.createCell(2).setCellValue("Test 3453");

【讨论】:

以上是关于Excel Apache POI 在执行 setCellValue() 时仅打印最后一个元素的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI:excel文件中的内容被破坏

如何使用Java和apache poi选择excel中的所有单元格

来自TXT的Apache POI Excel副本

java使用poi读取excel时,因一些格式问题,执行excel函数错误

通过apache poi以excel方式获取索引值

使用Apache POI基于csv表更新Excel工作表值