2016-03-18 95 views
0

我正在使用Apache POI 3.6,我試圖從Excel中讀取數據並將Excel數據轉換爲.CVS文件。 我Excel中的數據將在此格式同時將excel轉換爲.csv文件我無法轉換日期並將其保存在csv文件中?

  1. 第一列是:日期(8/6/2009)
  2. 第二列是:時間(上午12時00分01秒)
  3. 第3列將是:值1(30)
  4. 第4列將是:值2(400.99)。

我需要這個數據以這種格式(2009年8月6日)轉換並存儲在CVS文件 錯誤:我可以將數據存儲在csv文件,但即時通訊無法將日期轉換和時間在裏面。它在日期列中獲取一些值 我得到41426,並在時間列中獲得這個3456.0。

我沒有得到如何轉換這上面: 請人幫我了.. :(

我的代碼是在這裏:

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

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.DateUtil; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Excel { 

static void xlsx(File inputFile, File outputFile) { 
    // For storing data into CSV files 
    StringBuffer data = new StringBuffer(); 

    try { 
     FileOutputStream fos = new FileOutputStream(outputFile); 
     FileInputStream fio = new FileInputStream(inputFile); 
     // Get the workbook object for XLSX file 
     XSSFWorkbook wBook = new XSSFWorkbook(fio); 
     // Get first sheet from the workbook 
     XSSFSheet sheet = wBook.getSheetAt(0); 
     Row row; 
     Cell cell; 
     // Iterate through each rows from first sheet 
     Iterator<Row> rowIterator = sheet.iterator(); 

     while (rowIterator.hasNext()) { 
      row = rowIterator.next(); 

      // For each row, iterate through each columns 
      Iterator<Cell> cellIterator = row.cellIterator(); 
      while (cellIterator.hasNext()) { 

       cell = cellIterator.next(); 

       switch (cell.getCellType()) { 
        case Cell.CELL_TYPE_BOOLEAN: 
         data.append(cell.getBooleanCellValue() + ","); 
         break; 
        case Cell.CELL_TYPE_NUMERIC: 
         if (row.getCell(0).getCellType() == Cell.CELL_TYPE_NUMERIC){ 
          data.append(cell.getNumericCellValue() + ","); 
          } 
         if (DateUtil.isCellDateFormatted(row.getCell(0))) { 
          System.out.println ("Row No.: " + row.getRowNum()+ " " + 
           row.getCell(0).getDateCellValue()); 
          data.append(row.getCell(0).getDateCellValue() + ","); 
         } 
         break; 
        case Cell.CELL_TYPE_STRING: 
         data.append(cell.getStringCellValue() + ","); 
         break; 
        case Cell.CELL_TYPE_BLANK: 
         data.append("" + ","); 
         break; 
        default: 
         data.append(cell + ","); 

       } 
      }data.append("\r\n"); 
     }//System.out.println(); 
     //System.out.println(data); 
     fos.write(data.toString().getBytes()); 
     fos.close(); 

    } catch (Exception ioe) { 
     ioe.printStackTrace(); 
    } 
} 
//testing the application 

public static void main(String[] args) { 
    //reading file from desktop 
    File inputFile = new File("D:\\project-work\\sampleData.xlsx"); 
    //writing excel data to csv 
    File outputFile = new File("D:\\project-work\\Data.csv"); 
    xlsx(inputFile, outputFile); 
} 
+0

如果您將日期值存儲爲CSV中的字符串,則不會顯示您所看到的數字值。在Excel中,使用公式(例如:= YEAR(A1)和TEXT(A1,「mm」)和TEXT(A1,「dd」))將包含Date的列添加爲字符串。還有其他的方法可以做到這一點... Google的快速搜索可以更好地瞭解這一點。 – LuvnJesus

+0

爲什麼不使用[Apache POI提供的示例程序將XSLX文件轉換爲CSV](https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi /xssf/eventusermodel/XLSX2CSV.java),它爲你處理所有這些,並且比你的代碼更低的內存? – Gagravarr

回答

1

如果Excel有電池正確設定日期/時間,你應該能夠通過

Date date = cell.getDateCellValue() 

獲得實際的日期,那麼你可以使用SimpleDateFormatter或類似於它在您需要在您的CSV任何方式進行格式化。