【问题标题】:manipulate data before importing from excel to dataset在从 excel 导入数据集之前操作数据
【发布时间】:2011-03-28 08:40:56
【问题描述】:

我在 Excel 工作表中有几列数据,我必须将它们导入我的应用程序。

我使用 -

string strConn;
OleDbDataAdapter oledaExcelInfo;

strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + Server.MapPath(strSavePath + strRepFileName) + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
oledaExcelInfo = new OleDbDataAdapter("SELECT * FROM [Book1]", strConn);

dsetExcelInfo = new DataSet();            
oledaExcelInfo.Fill(dsetExcelInfo, "CCInfo");

虽然这会成功导入数据,但有时会错误地导入数据,即有时可以将数字 1234567 导入为 1.23E+06

如果excel文件中的数据是'1234567而不是1234567就可以解决(加单引号)

我现在正在尝试操作从 excel 中获取的数据,以便在导入数据之前以编程方式将 ' 附加到所有值以防止错误导入。

我什至尝试使用 OleDbDataAdapter.Update,但我想这不会有帮助,因为这会在导入数据后发生。对吗?

我可以操作数据以导入正确的数据吗?我该怎么做?

【问题讨论】:

  • 您是否尝试将单元格的格式设置为邮政编码,我知道这听起来很奇怪,但这似乎是让长数字工作的合理好方法。 (邮政编码是特殊格式,您可能需要从区域设置下拉菜单中选择美国英语)
  • 谢谢,我会尝试这样做。但是,该应用程序已经有很多用户,可能无法将单元格格式设置为邮政编码。 :( 我将不得不以编程方式处理这个问题。或者,我可以在通过我的代码导入之前格式化单元格吗?
  • 你可以试试:) ... Range("B1:B2").Select ... Selection.NumberFormat = "00000"

标签: c# excel import npoi oledbdataadapter


【解决方案1】:

我刚刚遇到了类似的问题(在这里找到它:Quirky SELECT from Excel file via OleDbDataAdapter method (C#))。

如果您只想使用没有外部库的 .NET 框架,请尝试使用以下连接字符串:

string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";  

将引擎从 JET 切换到 ACE 为我做到了。

【讨论】:

    【解决方案2】:

    我使用开源 NPOI library 从 excel 导入数据并保留电子表格中的数据格式,即 1234567 将作为 1234567 导入,而不是以 @ 等不同格式导入数据987654324@

    我没有像上面的问题那样导入数据,而是使用 NPOI 库导入数据 -

    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    
    HSSFWorkbook hssfworkbook;
    using (FileStream file = new FileStream(Server.MapPath(strSavePath + strRepFileName), FileMode.Open, FileAccess.Read))
    {
         hssfworkbook = new HSSFWorkbook(file);
    }
    Sheet sheet = hssfworkbook.GetSheet("Book1");
    
    DataTable dt = new DataTable();    //Create datatable 
    dt.Columns.Add();             //Add data columns
    
    for (int count = 0; count <= sheet.LastRowNum; count++)
    {
        DataRow dr = dt.NewRow();         //Create new data row
    
        //Based on the type of data being imported - get cell value accordingly    
        dr[0] = sheet.GetRow(count).GetCell(0).StringCellValue;   
        //dr[0] = sheet.GetRow(count).GetCell(0).NumericCellValue;
        //dr[0] = sheet.GetRow(count).GetCell(0).RichStringCellValue;
        //dr[0] = sheet.GetRow(count).GetCell(0).DateCellValue;
        //dr[0] = sheet.GetRow(count).GetCell(0).BooleanCellValue;
    
        dt.Rows.Add(dr);  //Add row to datatable
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-19
      • 2019-04-05
      • 2017-06-05
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多