7

Excel シートからの DateColumns の読み取りに問題があります。

人々が異なる日付形式を使用することがあり、これが問題を引き起こします。ユーザーが日付形式を変更したため07/26/2010に取得した Excel 列に期待する場合を考えてみましょう。26-Jul-2010

Microsoft.Jet.OLEDBxls シートを に読み込むために使用しDataTableます。

すべての日付を MM/DD/YYYY 形式に変換するために、XLS で DateFormat が設定されているものは何でも OleDb リーダーに強制できますか?

このコードを使用して、Excel ファイルを読み取ります。

string strConn;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
          "Data Source=" + uploadedFileInfo.FullName + ";" +
          @"Extended Properties=""Excel 8.0;HDR=NO;""";


using (OleDbConnection connToExcel = new OleDbConnection(strConn))
{
    //You must use the $ after the object you reference in the spreadsheet
    connToExcel.Open();

    string firstSheetName = ExcelUploadedFileReaderBuilder
                            .GetFirstExcelSheetName(connToExcel);

    OleDbDataAdapter myCommand 
    = new OleDbDataAdapter(String.Format("SELECT * FROM [{0}]", firstSheetName), connToExcel);

    DataSet myDataSet = new DataSet();

    myCommand.Fill(myDataSet, "uploadedExcelTable");

    DataTable dtUploadedExcel = myDataSet.Tables["uploadedExcelTable"];

    lineCount = GetLineNumberWhereNULLRowOccured(dtUploadedExcel) + 1;

    connToExcel.Close();
}
4

2 に答える 2

5

提案されているように、データセットをループする必要はありません。クエリで必要な形式を指定することにより、クエリですべての書式設定を行うことができます。
例は次のとおりです。

OleDbDataAdapter myCommand = 
  new OleDbDataAdapter("SELECT FORMAT([DateCol], 'MM/dd/yyyy') as [DateCol] FROM [SheetName]", connToExcel);

これは、JET OLEDB または Ace OLEDB データ プロバイダーを使用している限り、動作することが保証されています。他のデータ プロバイダーで動作することを保証することはできませんが、いつでも確認できます。

于 2010-08-20T16:15:30.090 に答える
1

データセットをループします。日付ごとに、それを日付に変換し (セルがテキストに変更されている場合)、日付を「MM/DD/YYYY」の形式の文字列としてフォーマットします。

次のコードは、開始するための例です。

string date1 = "07/26/2010";
string date2 = "26-Jul-2010";

DateTime dt1 = Convert.ToDateTime(date1);
DateTime dt2 = Convert.ToDateTime(date2);

string date1B = dt1.ToString("MM/DD/YYYY");
string date2B = dt2.ToString("MM/DD/YYYY");

date1B と date2B は等しくなり、希望する形式になります。

これは、ユーザー入力が Excel からのものであるため、ユーザー入力を検証する必要があり、ユーザーがデータベース モデルに準拠しないデータを入力するのは非常に簡単であるためです。

入力された日付の一部が有効な日付ではない場合に備えて、すべてを Try-Catch ブロックに入れることをお勧めします。

于 2010-08-20T15:29:55.537 に答える