在Apache POI中通过单元格名称设置新的单元格值

3
我对Java和Apache POI不太熟悉,但是我有一个任务需要从命令行读取Excel文件的名称以及需要修改的列的名称和值。
因此,最终应用程序将会像这样运行: java test -f test.xls -i B2=10;B3=20;B4=30
我已经创建了一个存储单元格名称及其值的映射表,但我不知道如何使用该映射表来按名称(例如:B2)访问单元格并设置新值(例如:10)。
到目前为止,我的代码如下:
package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
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 and output cells
        Map<String, String> inputCellsMap = new HashMap<String, String>();
        Map<String, String> outputCellsMap = new HashMap<String, String>();

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

        // 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[3].split(";")) {
            inputCellsMap.put(element.split("=")[0], element.split("=")[1]);
        }

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

            // TODO
            // Get cells by name and set their new value

            //System.out.println("Key : " + entry.getKey() + " Value :" + entry.getValue());
        }           

        workbook.close();       
    }
}

我想到的第一个想法是将Map值设置为Cell而不是String。 - M3SSYM4RV1N
2个回答

6
一旦您获得了输入,获取单元格引用文本,例如"B2"和值。
使用该文本创建CellReference。然后,您可以获取基于0的行和列索引,这些索引可用于获取Row,然后是Cell对象,在该对象上您可以调用setCellValue
CellReference cr = new CellReference(entry.getKey());
int r = cr.getRow();
int c = cr.getCol();

Row row = sheet.getRow(r);
if (row == null)
    row = sheet.createRow(r);
Cell cell = row.getCell(c, Row.CREATE_NULL_AS_BLANK);
cell.setCellValue(entry.getValue());

谢谢您的回答。我收到了一个错误,说“CREATE_NULL_AS_BLANK无法解析或不是字段”。 - Cosmin
还有一件事。它似乎设置了值,但是当我之后尝试获取时,无法得到。我认为它应该设置为数字类型。这可能吗? - Cosmin
将该值解析为 int(或其他数字原始类型),然后调用 Cell 的重载 setCellValue(int) - rgettman

3
您可以使用这些方法来访问行和列。(例如:E101)
sheet.getRow(100).getCell(5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接