MVC 5アプリケーションでExcelPackage関数を使用しています。強く型付けされたモデルを新しいExcelファイルに正常に出力できます。Epplus ExcelWorksシートで日時の値を見つける方法
- ヌル
- 日付のみ
- 時間だけ
- 日時
I:
Iは、特定の列は、4つの可能な値を持つnull許容のDateTimeである場合を持っていますワークシート内のDateTime値を特定する作業を行う関数を抽出しました。 DateTimeの値は一貫して識別され、正しくフォーマットされていますが、ネストされたループと同じ結果を得るためのより良い方法があるとは思えません。
IEnumerableに任意のIEnumerableを受け入れるように設計されているため、IEnumerableにDateTime値が含まれる列を予測できません。そのため、私は既知の範囲の細胞をハードコードすることはできません。
より良いコンテキストを提供するために、ここにクラスコンストラクタが貼り付けられ、その後に私がより良くしようとしている関数が貼り付けられています。コメントを取り除いても、それはまだネストされたコードのかなり醜いセットです。
要約すると、私の質問はこれです:C#言語やNuget Epplusパッケージに関してより洗練されたコーディング手法が欠けていますか?
public class EpplusExcelPackage<T>
{
private IEnumerable<T> _data;
private string _reportName;
public EpplusExcelPackage(IEnumerable<T> Data, string ReportName)
{
this._data = Data;
this._reportName = ReportName;
}
// much more code...
これは私がより効率的にしていきたいと考えてい方法である:それがダウンしてあなたがソースがテーブルが「適切」フォーマットされている優れていることをどのように自信を持ってくるに
private static void FormatDateTimeValuesInWorksheet(ExcelWorksheet worksheet)
{
/* correctly format datetime values as:
* if date only, format as shortdate
* if time only, format as am/pm time
* if date & time present, format as default datetime */
// the worksheet is data is a strongly-typed model, populated in the model constructor
System.DateTime dateValue; // used as the out variable of DateTime.TryParse()
// nested for-loop to find datetime values in worksheet
for (int i = worksheet.Dimension.Start.Column; i < worksheet.Dimension.End.Column; i++)
{
for (int j = worksheet.Dimension.Start.Row; j < worksheet.Dimension.End.Row; j++)
{
// ignore null cell values to prevent null exception error
if (worksheet.Cells[i, j].Value != null)
{
// convert the cell value to string: required by TryParse()
string cellValue = worksheet.Cells[i, j].Value.ToString();
// identify type of datetime and format accordingly
if (DateTime.TryParse(cellValue, out dateValue))
{
if (dateValue.Date == Convert.ToDateTime("12/30/1899"))
{
worksheet.Cells[i, j].Value = dateValue.ToShortTimeString();
}
else if (dateValue.TimeOfDay.TotalSeconds == 0)
{
worksheet.Cells[i, j].Value = dateValue.ToShortDateString();
}
else // do not change
{
worksheet.Cells[i, j].Value = worksheet.Cells[i, j].Value;
}
}
}
}
}
}
EPPLusについて独自の解釈をしてくれてありがとうございました。私はタイプがダブルであると仮定したので、私は1/1/201のような日付で問題を抱えていました。私はEPPLusがいくつかの前処理をしている可能性があると思っています。 –