0

我用于读取 excel 文件的代码对于许多行都可以正常工作,但它没有显示文件中的某些内容,例如(#######)和日期,例如(2009 年 8 月 11 日),但确实显示日期例如(2011 年 11 月 12 日)有一个 2 位数的日期。

DataTable dtExcel = new DataTable();

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + HafizwalaFile + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
string strSQL = "SELECT * FROM [qe$] ";
OleDbConnection excelConnection = new OleDbConnection(connectionString);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(strSQL, excelConnection);

dataAdapter.Fill(dtExcel);
   for (int i = 0; i < dtExcel.Rows.Count; i++)
   {
      for (int j = 0; j < dtExcel.Columns.Count;j++ )
      {
         System.Console.WriteLine(dtExcel.Rows[i][j]);
         count_records++;
      }
   }
4

3 回答 3

1

在将数据传输到表格之前,您必须输入文件excel并调整此列的工作表宽度如下

 //using Microsoft.Office.Interop.Excel;
        Microsoft.Office.Interop.Excel.Application excelapp = new Microsoft.Office.Interop.Excel.Application();
       // excelapp.Visible = true;
        string filename_Path = @"D:\exmp1.xls";
        _Workbook workbook = (_Workbook)(excelapp.Workbooks.Open(filename_Path, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing));



    excelapp .Cells .Columns .AutoFit ();
    workbook.Save();
   // workbook.Close();
    excelapp.Quit(); 
于 2013-11-13T17:44:09.660 回答
0

发生这种情况是因为您将列格式化为 Date ,并且您输入的数据不是有效日期。您可以使用 C# 从 C# 中检查这一点:
MessageBox.Show(dtExcel.Columns[0].DataType.ToString());
Excel 将日期和时间存储为一个数字,表示自 1900 年 1 月 0 日以来的天数,加上 24 小时日的小数部分:ddddd.tttttt 阅读这个
我试过很多次,我发现以下代码工作正常,(请测试):

String cellValue = "41577.333333"; // 30/10/2013  8:00:00 AM
            int days  = 0 ;
            int hours = 0;
            string[] arr =  cellValue.Split('.');
            days = int.Parse(arr[0]);
            if(arr.Length == 2)
            {
                decimal  d_hours = decimal.Parse("0." +  arr[1]);
                hours =(int) ( d_hours  * 24  );
            }

            TimeSpan dateFromExcel = new TimeSpan(days ,hours ,0,0,0);
            DateTime resultingDate = new DateTime(1900,1,1 ,0,0,0).Add(dateFromExcel).AddDays(-2);
            MessageBox.Show(resultingDate.ToString());

尝试使用 ACE 而不是 JET ,一些网站提到了这一点:

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;;Data Source=" + HafizwalaFile + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
于 2013-11-13T19:19:00.393 回答
0

我建议将excel的该列格式化为日期格式,强制它填充0或保持纯文本。我认为您在 c# 方面无能为力

于 2013-11-13T17:06:50.193 回答