【问题标题】:Converting this excel to datatable将此excel转换为数据表
【发布时间】:2012-01-30 14:10:31
【问题描述】:

我之前成功将Excel转换为数据表,但是现在,我的表格格式很奇怪,下图将显示excel表格,以及我想要实现的表格。

var workbook = Workbook.Load("file.xls");
var worksheet = workbook.Worksheets[0];
var cells = worksheet.Cells;
var dataTable = new DataTable("datatable");


for (int colIndex = cells.FirstColIndex; colIndex <= cells.LastColIndex; colIndex++)
{
    dataTable.Columns.Add(cells[0, colIndex].StringValue);
}

for (int rowIndex = cells.FirstRowIndex; rowIndex <= cells.LastRowIndex; rowIndex++)
{
    var values = new List<string>();
    foreach(var cell in cells.GetRow(rowIndex))
    {
        values.Add(cell.Value.StringValue);
    }

    dataTable.LoadDataRow(values.ToArray(), true);
}

这是代码。当我将它与提到的 .xls 一起使用时,我得到“价格:行左移。 示例:http://i.imgur.com/QUngL.png 因此,任何有关如何解决此问题的帮助都非常受欢迎。 谢谢。

【问题讨论】:

  • 当你调试这个时 colIndex 上的整数位置是什么听起来你在某处有一个 1 的计数。在 rowIndex 上你确定你是从 0 开始它们还是你想开始它们基于它找到的第一个 rowIndex 或 colIndex 而不是 LastColIndex 你能以某种方式获取列 Count 以使其更精确
  • 行 A 被 2 x 2 个单元格合并。当我以这种方式将其转换为数据表时,这双行未合并,值转到上单元格,下单元格为空,因此第二行向左移动。我添加了示例。
  • 你可以尝试一些不同的东西吗..我想粘贴并稍微改变你的代码..每个foreach循环我都会有评论解释好
  • 我粘贴了下面的代码,但是您必须将 DataTable dt 传递给您的方法,或者像下面显示的那样创建它。试试看.. 还要确保循环查看双精度值是什么,如果它们真的被转换为字符串,我还会将代码包装在 Try Catch 周围,以便您可以捕获任何类型转换错误..跨度>
  • 谢谢。我会尽力。告诉我要添加到“使用”中的内容。谢谢。

标签: c# excel datatable excellibrary


【解决方案1】:

这是一个参考链接,有人遇到相同问题以及如何解决问题

How To Resolve Exce.Interop Issue Culture Settings

错误是 .NET 会检查您的线程(C# 或 VB 代码)本地化是否适合您之前安装的 MS Excel 本地化,如果不适合,则表明 Microsoft.Office.Interop 库已旧或无效。 您的线程本地化来自您的计算机区域设置(来自控制面板 --> 区域和语言)

那么有两种方案可以解决这个问题: 1.改变你的线程本地化(通过代码) 2. 为您的 Office 安装语言包

第一个解决方案是这样的:

using System.Threading;     // For setting the Localization of the thread to fit
using System.Globalization; // the of the MS Excel localization, because of the MS bug.

            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            excelFileName = System.IO.Path.Combine(excelPath, "Ziperty Buy Model for Web 11_11_2011.xlsm");

【讨论】:

    【解决方案2】:

    不用打开也可以找回

    仅对 xlsm 文件使用“Excel 12.0 Macro”而不是“Excel 12.0”

    HDR=YES 表示您的 Excel 表格有表头

     Dim myWorkBookPath AS String = "C:\test.xlsx"
        Dim mySheetName As String= "Sheet1"
        Dim myRangeAddress as String = "A1:K10"  'if you retrieve this by program, think to remove all $ signs . .Replace("$","")
             Dim myXlConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0;HDR=YES""", myWorkBookPath)
                  Dim myXlConnection = New OleDb.OleDbConnection(myXlConnectionString)
                  Dim sXlCommand As OleDbCommand = New OleDbCommand(String.Format("Select * FROM [{0}${1}]", mySheetName, myRangeAddress), myXlConnection)
                  Dim dt = New Data.DataTable()
                  Dim da = New OleDbDataAdapter(sXlCommand)
                  myXlConnection.Open()
                  da.Fill(dt)
                  myXlConnection.Close()
                  Return dt
    

    【讨论】:

      【解决方案3】:

      在 .cs 文件的顶部放入您的使用中

      using System.Reflection; 
      using Microsoft.Office.Interop.Excel;
      
              // TO USE:
              // 1) include COM reference to Microsoft Excel Object library
              // add namespace...
              // 2) using Excel = Microsoft.Office.Interop.Excel;
              private static void Excel_FromDataTable(<strong class="highlight">DataTable</strong> dt)
              {
                  // Create an Excel object and add workbook...
                  Excel.ApplicationClass excel = new Excel.ApplicationClass();
                  Excel.Workbook workbook = excel.Application.Workbooks.Add(true); // true for object template???
      
                  // Add column headings...
                  int iCol = 0;
                  foreach (DataColumn c in dt.Columns)
                  {
                      iCol++;
                      excel.Cells[1, iCol] = c.ColumnName;
                  }
                  // for each row of data...
                  int iRow = 0;
                  foreach (DataRow r in dt.Rows)
                  {
                      iRow++;
      
                      // add each row's cell data...
                      iCol = 0;
                      foreach (DataColumn c in dt.Columns)
                      {
                          iCol++;
                          excel.Cells[iRow + 1, iCol] = r[c.ColumnName];
                      }
                  }
      
                  // Global missing reference for objects we are not defining...
                  object missing = System.Reflection.Missing.Value;
      
                  // If wanting to Save the workbook...
                  workbook.SaveAs("TestExcel.xls",
                      Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing,
                      false, false, Excel.XlSaveAsAccessMode.xlNoChange,
                      missing, missing, missing, missing, missing);
      
                  // If wanting to make Excel visible and activate the worksheet...
                  excel.Visible = true;
                  Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet;
                  ((Excel._Worksheet)worksheet).Activate();
      
                  // If wanting excel to shutdown...
                  ((Excel._Application)excel).Quit();
              }
      

      【讨论】:

      • 我收到异常“旧格式或无效类型库。(来自 HRESULT 的异常:0x80028018 (TYPE_E_INVDATAREAD))”并且您已两次声明 iCol。
      • 让我仔细检查一下代码.. 我有时讨厌在这里编辑.. 等等
      • 我粘贴了我拥有的东西,它可以工作..你在哪一行得到错误..这就是我的方法的样子
      • Excel.Workbook 工作簿 = excel.Application.Workbooks.Add(true);在这里我得到了例外。
      • 我认为您可能在查看此链接时遇到了文化问题。这应该可以解决 support.microsoft.com/default.aspx?scid=kb;en-us;320369
      猜你喜欢
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多