我在一个MVC 5应用程序中拥有一个工作的ExcelPackage函数,可以成功地将强类型模型输出到新的Excel文件中。
我有一个特殊列为可空DateTime的情况,它有四种可能的值:
- null
- 仅日期
- 仅时间
- 日期和时间
我已经提取了一个函数来识别工作表中的任何DateTime值。虽然DateTime值被一致地识别和格式化正确,但我认为可能会有比嵌套循环更好的方法来实现相同的结果。
由于此功能(和包含类)旨在接受任何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;
}
}
}
}
}
}