簡體   English   中英

按列名查找單元格並更改數據類型

[英]Find cells by their column name and change data type

我有一個簡單的方法來讀取 csv 並將其轉換為 Excel:

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[] dataRow = null;
        int rowNum = 0;
        while ((dataRow = csvReader.readNext()) != null) {
            Row currentRow = sxssfSheet.createRow(rowNum);
            for (int i = 0; i < dataRow.length; i++) {
                String cellValue = dataRow[i];
                currentRow.createCell(i).setCellValue(cellValue);
            }
            rowNum++;
        }
        sxssfWorkbook.write(new FileOutputStream("P:\\employees.xlsx"));
    }

但是單元格數據類型有問題。 我所有的數據現在都表示為文本。 我想按名稱(例如agepaid_total )而不是索引查找列,並為這些列設置數字(浮點)數據類型。 像這樣的東西(對不起,對於類似 sql 的風格,對我來說,描述起來更簡單): WHEN columnName IN ('age', 'paid_total') SET allColumnType AS NUMERIC 我怎樣才能做到這一點? 或者只有索引才有可能?

CSV 文件始終是沒有數據類型的純文本文件。 但是,如果您確切地知道哪一列應該是哪種數據類型,那么就可以創建一個類型安全的 Excel 工作表。 這可以通過列索引以及列 header 來實現。要通過列 header 檢測類型,這些標題必須放入單獨的數據結構中。 但這總是有益的。

讓我們以此處的示例employees.csv為例: https://gist.github.com/kevin336/acbb2271e66c10a5b73aacf82ca82784

然后以下應該工作:

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.streaming.*;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;

import com.opencsv.CSVReader;

import java.time.format.DateTimeFormatterBuilder;
import java.time.format.DateTimeFormatter;
import java.time.LocalDate;

class CreateExcelFromCSVDifferentDataTypes {
    
 public static void main(String[] args) throws Exception {

  try (
   SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); FileOutputStream fileout = new FileOutputStream("./employees.xlsx");
   CSVReader csvReader = new CSVReader(new FileReader("./employees.csv"));
   ) {

   sxssfWorkbook.setCompressTempFiles(true);
   
   CellStyle dateStyle = sxssfWorkbook.createCellStyle();
   dateStyle.setDataFormat(sxssfWorkbook.getCreationHelper().createDataFormat().getFormat("dd-MMM-yy"));
   
   SXSSFSheet sxssfSheet = sxssfWorkbook.createSheet("Sheet");
   sxssfSheet.setRandomAccessWindowSize(100);
   
   String[] strHeaders = null;
   String[] dataRow = null;
   int rowNum = 0;
   while ((dataRow = csvReader.readNext()) != null) {
    if (rowNum == 0) strHeaders = dataRow;
    Row currentRow = sxssfSheet.createRow(rowNum);
    for (int i = 0; i < dataRow.length; i++) {
     String cellValue = dataRow[i];
     if (rowNum > 0 && "HIRE_DATE".equals(strHeaders[i])) {
      DateTimeFormatter formatter= new DateTimeFormatterBuilder().parseCaseInsensitive().appendPattern("dd-MMM-yy").toFormatter(java.util.Locale.ENGLISH);
      LocalDate localDate = LocalDate.parse(cellValue, formatter);
      currentRow.createCell(i).setCellValue(localDate);
      currentRow.getCell(i).setCellStyle(dateStyle);
     } else if (rowNum > 0 &&  "SALARY".equals(strHeaders[i])) {
      double d = Double.valueOf(cellValue);
      currentRow.createCell(i).setCellValue(d);   
     } else {    
      currentRow.createCell(i).setCellValue(cellValue);
     }
    }
    rowNum++;
   }
   
   sxssfWorkbook.write(fileout);
   sxssfWorkbook.dispose(); 
  }
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM