如何按列名而非索引设置Excel指定列的数值数据类型?
解决方案
不需要只能通过索引操作,我们可以通过先读取CSV表头建立列名与索引的映射,再针对指定列名转换数据类型。具体实现步骤如下:
- 读取CSV的第一行作为表头,构建列名→列索引的映射Map
- 定义需要转为数值类型的列名集合(比如
age、paid_total) - 遍历数据行时,根据映射Map找到目标列的索引,尝试将单元格值转为浮点型;其他列保持文本类型
修改后的完整代码如下:
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import au.com.bytecode.opencsv.CSVReader; import java.io.FileReader; import java.io.FileOutputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class CsvToExcel { public static void main(String[] args) throws Exception { CSVReader csvReader = new CSVReader(new FileReader("P:\\employees.csv")); SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); SXSSFSheet sxssfSheet = sxssfWorkbook.createSheet("Sheet"); // 读取表头,建立列名到索引的映射 String[] headerRow = csvReader.readNext(); Map<String, Integer> columnNameToIndex = new HashMap<>(); for (int i = 0; i < headerRow.length; i++) { columnNameToIndex.put(headerRow[i].trim(), i); } // 定义需要转为数值类型的列名集合 Set<String> numericColumns = new HashSet<>(); numericColumns.add("age"); numericColumns.add("paid_total"); // 写入表头行 Row headerExcelRow = sxssfSheet.createRow(0); for (int i = 0; i < headerRow.length; i++) { headerExcelRow.createCell(i).setCellValue(headerRow[i]); } // 处理数据行 String[] dataRow = null; int rowNum = 1; // 表头已占第0行 while ((dataRow = csvReader.readNext()) != null) { Row currentRow = sxssfSheet.createRow(rowNum); for (int i = 0; i < dataRow.length; i++) { String cellValue = dataRow[i].trim(); // 获取当前列的列名 String columnName = headerRow[i].trim(); if (numericColumns.contains(columnName)) { // 尝试转为浮点型,处理转换失败的情况 try { double numericValue = Double.parseDouble(cellValue); currentRow.createCell(i).setCellValue(numericValue); } catch (NumberFormatException e) { // 转换失败时仍保留文本,或根据需求设置为空白/默认值 currentRow.createCell(i).setCellValue(cellValue); } } else { // 非目标列保持文本类型 currentRow.createCell(i).setCellValue(cellValue); } } rowNum++; } sxssfWorkbook.write(new FileOutputStream("P:\\employees.xlsx")); // 关闭资源 csvReader.close(); sxssfWorkbook.close(); } }
关键说明
- 表头映射:通过
columnNameToIndex存储列名和对应索引,后续无需硬编码索引,直接通过列名定位 - 数值转换:针对指定列名尝试转换为
double类型,同时捕获NumberFormatException避免因数据格式错误导致程序崩溃 - 资源关闭:添加了IO资源的关闭操作,避免资源泄漏
内容的提问来源于stack exchange,提问作者takotsubo
相关产品推荐
相关产品推荐

