EPPlus を使用して Excel データを読み取っています。グリッド内の Excel セルをそのままユーザーに表示する必要があります。
日付列の読み取り中に、EPPlus は日付のOADate int 値を提供します。
ユーザーがExcelを開いたときに通常表示される値を文字列として読み取る方法はありますか。つまり、Excel 形式を適用した後の値です。
valueAsStringやvalueAsDisplayedなどを提供するCELLクラスには関数がないようです...
日付が、書式設定が適用された double (時間要素がない場合は整数) として Excel に格納されている場合は、これが「正しい」方法であり、コードで日付を再作成し、Excel で適用された日付形式を再適用します。唯一の問題は、特に大文字と小文字の区別に関しては、Excel の書式設定が .net とわずかに異なるため、MMM が mmm ではないことを確認するためにそこにチェックを入れる必要があります (これにより、.net で分が得られます)。したがって、次のようなものが機能します。
[TestMethod]
public void OADate_Test()
{
//http://stackoverflow.com/questions/28046069/epplus-date-column-returning-int-rather-than-the-actual-displayed-text-value
var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
if (existingFile.Exists)
existingFile.Delete();
using (var package = new ExcelPackage(existingFile))
{
//.NET is case sensive so MMM must be capital but Excel might not be
const string FORMATDATE = "dd-MMM-yyyy";
var mydate = new DateTime(2015, 1, 1);
var datedouble = mydate.ToOADate();
var worksheet = package.Workbook.Worksheets.Add("Newsheet");
worksheet.Cells["A1"].Value = "As Date";
worksheet.Cells["A2"].Value = datedouble;
worksheet.Cells["A2"].Style.Numberformat.Format = FORMATDATE;
package.Save();
}
using (var package = new ExcelPackage(existingFile))
{
var worksheet = package.Workbook.Worksheets["Newsheet"];
worksheet.Cells["B1"].Value = "As String";
var datedouble = (double) worksheet.Cells["A2"].Value;
worksheet.Cells["B2"].Value = DateTime.FromOADate(datedouble).ToString(worksheet.Cells["A2"].Style.Numberformat.Format);
package.Save();
}
}