2017-05-11 16 views
0


返信する前に私の問題を理解しているように見えるほど簡単ではありません。 Google検索を行い、結果へのリンクを投稿しないでください。私はすでに見た。Apache POI to excel - 0日付

私はJavaアプリケーションで置き換えているVB.Netアプリケーションを持っています。このアプリケーションの目的は、Excelシート(.xls)を作成することです。その後、ファイルは第三者に送信され、そのファイル内のデータが処理されます。私はファイルを書き込むためにAPACHE POIを使用しています。

2つのタイムフィールドが「無効」であるため、最終製品が第2者によって拒否されています。しばらく私の頭を傷つけた後、私はJavaがファイルを生成し、VB.Netが生成したファイルが日付の値を別々に扱っていることに気付きました。軍事時間に午後3時30分になったとすると、データは両方のファイルに15:30と表示されます。問題は、フィールドの日付部分です:
VB.Netは、生成された:1/0/1900 15:30
Javaは、生成された:1970年1月1日午前15時30

私は見つけることができないよう方法を模倣するPOIを持っている方法は0の日付を処理する優れています。以下は私が試したことのいくつかです。
Javaアプリケーションで日付/時刻変数を1/0/1900 15:30と設定しました。これにより、アプリケーションにエラーが発生します。
変数を文字列として設定し、ワークシートに渡してから、セルの書式を設定します。エラーは出ませんが、セルをダブルクリックしてEnterキーを押すまで、データは「一般」のままです。このプロセスは自動化されるため、これはオプションではありません。
セルの式を= TIMEVALUE( "15:30")に設定しましたが、これは第2者によって受け入れられませんでした。

他に誰かがこの問題に遭遇しましたか?誰もこれを回避する方法を考えることができますか?第2の当事者がファイルを読む方法を変更することはオプションではありません。

答えて

1

あなたが知る必要があるのは、Excelは、datetime値を浮動小数点のdouble値として格納することです。 0 = 00:00:00と1 = 24:00:00 = 01/01/1900 00:00:00です。また、0.5 = 12:00:00と1.5 = 36:00:00 = 01/01/1900 12:00:00。つまり、Excelのdatetime値は0から始まり、1は1日で、01/01/1900です。 1/24は1時間、1/24/60は1分、1/24/60/60は1秒です。

Java Dateを使用した場合の問題は、Calendarコンストラクタの月が0ベースであることです。したがって、0月は1月で、new GregorianCalendar(1900, 0, 1, 15, 30, 0)は01/01/1900 15:30:00になります。そして、0日がないので、new GregorianCalendar(1900, 0, 0, 15, 30, 0)は12/31/1899 15:30:00となり、Excelの場合は-1になります。

Excelの日付動作の問題が分かっているので、apache poiDateUtilを提供します。

import java.io.*; 

import org.apache.poi.ss.usermodel.*; 

import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

import java.util.Calendar; 
import java.util.GregorianCalendar; 

class XSSFNullDateTest { 

public static void main(String[] args) { 
    try { 

    Workbook wb = new XSSFWorkbook(); 
    Sheet sheet = wb.createSheet("Sheet1"); 

    CreationHelper creationHelper = wb.getCreationHelper(); 
    CellStyle cellStyleTime = wb.createCellStyle(); 

    cellStyleTime.setDataFormat(creationHelper.createDataFormat().getFormat("hh:mm:ss")); 

    //using a Calendar: 
    Calendar calendar = new GregorianCalendar(1900, 0, 1, 15, 30, 0); 
    System.out.println(calendar.getTime()); //01/01/1900 15:30:00 
    double doubleTime = DateUtil.getExcelDate(calendar, false); 
    System.out.println(doubleTime); //1.6458333333333335 
    Cell cell = sheet.createRow(0).createCell(0); 
    cell.setCellValue(doubleTime-1); //subtract 1 so we have day 0 
    cell = sheet.getRow(0).createCell(1); 
    cell.setCellValue(doubleTime-1); //subtract 1 so we have day 0 
    cell.setCellStyle(cellStyleTime); 

    //using a string: 
    doubleTime = DateUtil.convertTime("15:30:00"); 
    System.out.println(doubleTime); //0.6458333333333334 = day 0 already 
    cell = sheet.createRow(1).createCell(0); 
    cell.setCellValue(doubleTime); 
    cell = sheet.getRow(1).createCell(1); 
    cell.setCellValue(doubleTime); 
    cell.setCellStyle(cellStyleTime); 


    OutputStream out = new FileOutputStream("XSSFNullDateTest.xlsx"); 
    wb.write(out); 
    wb.close(); 

    } catch (Exception ex) { 
    ex.printStackTrace(); 
    } 
} 
} 
:私たちが行うことができ、これを使用して