いくつかのxlsx
ドキュメントを消費する必要があります。私はReading a date from xlsx using open xml sdkとhttp://www.dotnetperls.com/fromoadateを読みました。私の列のほとんどはテキスト (共有文字列) ですが、数字 (整数) もいくつかあり、日付と日時もいくつかあります。OpenXML SDK 2.5 を使用しています。
私の問題は、実際の数字と日付を区別する方法がわからないことです。どちらも を持ってDataType
おりnull
、テキストによる数値表現はText
セルのプロパティにあります。
いくつかのコード:
using (var xlsxStream = assembly.GetManifestResourceStream("Checklist.xlsx"))
using (var spreadsheetDocument = SpreadsheetDocument.Open(xlsxStream, false))
{
var workbookPart = spreadsheetDocument.WorkbookPart;
var sharedStringTable = workbookPart.SharedStringTablePart.SharedStringTable;
var worksheetPart = workbookPart.WorksheetParts.First();
var sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string text;
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
if (c.CellValue != null)
{
text = c.CellValue.Text;
if (c.DataType != null)
{
if (c.DataType.Value == CellValues.SharedString)
{
int tableIndex = int.Parse(text);
text = sharedStringTable.ChildElements[tableIndex].InnerText;
}
// note: the date cells do not have c.DataType.Value == CellValues.Date
// Their c.DataType is null, if they are OLE Automation date numbers
}
// So here I am, and I'd need to know if the number supposed to be an
// OLE Automation date or a number, so I can transform it if needed.
//if (it's a date) // <- ?????
//{
// double dateDouble = double.Parse(text);
// DateTime dateTime = DateTime.FromOADate(dateDouble);
// text = dateTime.ToShortDateString();
//}
Console.Write(text + " ");
}
else
{
Console.Write("NULL" + " ");
}
}
Console.WriteLine();
}
Console.WriteLine();
Console.ReadKey();