java - 使用 Apache POI 获取/修改一个或多个 Excel 工作表中的单元格值

标签 java excel apache-poi

我有一个用 Java 编写的小型应用程序,它使用 Apache POI 来读取/修改 Excel 文档中的值。我使用工作表名称引用单元格,例如工作表“Sheet1”中的单元格 A1,我使用“Sheet1!A1”。

应用程序从命令行运行,带有三个参数:文档名称、包含我要替换的值的单元格、我想要从中获取输出的单元格。

示例:ReadExcel test.xls Sheet1!B2=10;Sheet1!B3=20 Sheet1!B7

上面的例子运行良好。

问题是当我想修改单元格或从另一张工作表获取输出时。

示例:ReadExcel test.xls Sheet1!B2=10;Sheet1!B3=20 Sheet2!B2

我的代码如下:

package poitest;

import java.util.List;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.ss.usermodel.*;

public class ReadExcel {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        // Will contain cell name / value pair for input cells          
        Map<String, String> inputCellsMap = new HashMap<String, String>();

        // Will contain cell name for output cells
        List<String> outputCells = new ArrayList<String>();

        // Open the Excel file
        FileInputStream file = new FileInputStream(new File(args[0]));

        // Get the current workbook
        HSSFWorkbook workbook = new HSSFWorkbook(file);

        // Get the first sheet of the workbook
        HSSFSheet sheet = workbook.getSheetAt(0);

        // Get the input cells that need to be modified and
        // store their name and value in the inputCellsMap
        for (String element : args[1].split(";")) {
            inputCellsMap.put(element.split("=")[0], element.split("=")[1]);
        }

        // Get the output cells that will be accessed for resulting values
        for (String element : args[2].split(";")) {
            outputCells.add(element);           
        }

        // Loop through the cells that need to be modified and 
        // set the new value in the Excel document
        Iterator<Entry<String,String>> inputIterator = inputCellsMap.entrySet().iterator();
        while (inputIterator.hasNext()) {
            Map.Entry<String,String> inputEntry = (Map.Entry<String,String>) inputIterator.next();

            CellReference cellReferenceInput = new CellReference(inputEntry.getKey());
            int cellReferenceInputRow = cellReferenceInput.getRow();
            int cellReferenceInputColumn = cellReferenceInput.getCol();

            Row rowInput = sheet.getRow(cellReferenceInputRow);
            if (rowInput == null)
                rowInput = sheet.createRow(cellReferenceInputRow);
            Cell cellInput = rowInput.getCell(cellReferenceInputColumn, Row.CREATE_NULL_AS_BLANK);              
            cellInput.setCellValue(Integer.parseInt(inputEntry.getValue()));        
        }

        // Apply all formulas after altering cell values
        HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);

        // Get the results from the output cells
        for (int i = 0; i < outputCells.size(); i++) {
            CellReference cellReferenceOutput = new CellReference(outputCells.get(i));
            int cellReferenceOutputRow = cellReferenceOutput.getRow();
            int cellReferenceOutputColumn = cellReferenceOutput.getCol();

            Row rowOutput = sheet.getRow(cellReferenceOutputRow);
            Cell cellOutput = rowOutput.getCell(cellReferenceOutputColumn, Row.CREATE_NULL_AS_BLANK);

            // Display results
            System.out.println(cellOutput.getNumericCellValue());                       
        }           

        workbook.close();       
    }
}

最佳答案

如果你看看 CellReference 的最长构造函数,您会注意到引用包含 5 个属性:

  • 字符串sheetName(可以为空)
  • 整数行
  • int 列
  • boolean 行绝对
  • boolean 值 colAbsolute

您的命令行参数包括工作表名称,但您没有使用它。

首先,从代码中删除以下行:HSSFSheet Sheet = workbook.getSheetAt(0);

相反,您需要使用 getSheet(String) 按名称查找工作表。 ,在您创建 CellReference 之后:

HSSFSheet sheet = workbook.getSheet(cellReferenceInput.getSheetName());

HSSFSheet sheet = workbook.getSheet(cellReferenceOutput.getSheetName());

关于java - 使用 Apache POI 获取/修改一个或多个 Excel 工作表中的单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670604/

相关文章:

java - 如何为 JavaFX 舞台创建调整大小动画?

使用 EPPlus 与 Spreadsheet Gear 读取/写入多个文件时的性能差异

python - 使用openpyxl复制工作表时如何保留VBA代码?

java - HSSFCell setCellStyle 在所有工作表的单元格而不是选定的单元格上应用样式

java - 如何使用 POI 测试单元格是否符合 ConditionalFormattingRule 中定义的规则?

java - 在ListView中显示外部SD卡中的音乐文件列表

java - ConcurrentHashMap中Bucket级锁和Segment级锁的区别?

java - android: 任务 ':app:dexDebug' zxing 条码扫描器执行失败

java - 使用 JExcelApi 将包含时间的 Excel 单元格值报告为 12 小时而不是 24 小时

java - Apache POI : Check if a column is empty