Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将此excel转换为datatable_C#_Excel_Datatable_Excellibrary - Fatal编程技术网

C# 将此excel转换为datatable

C# 将此excel转换为datatable,c#,excel,datatable,excellibrary,C#,Excel,Datatable,Excellibrary,我之前成功地将Excel转换为datatable,但现在,我有了一个格式怪异的表,下面的图片将显示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.F

我之前成功地将Excel转换为datatable,但现在,我有了一个格式怪异的表,下面的图片将显示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一起使用时,我得到的价格是:行左移。 例子: 因此,任何关于如何解决这个问题的帮助都是非常受欢迎的。
谢谢。

在.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();
        }

这里是一个参考链接,有人有同样的问题,以及如何解决这个问题

错误在于.NET检查线程C或VB代码本地化是否适用于您先前安装的MS Excel本地化,如果不适用,则表明Microsoft.Office.Interop库已过时或无效。 线程本地化是从控制面板->区域和语言中的计算机区域设置派生的

然后有两个选项可以解决此问题: 1.通过代码更改线程本地化 2.为您的办公室安装语言包

第一种解决方案如下:

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");

您可以在不打开它的情况下检索它

仅对xlsm文件使用Excel 12.0宏而不是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

当你调试这个时,colIndex上的整数位置听起来像是在某个地方有一个1的倒计时。。另外,在rowIndex上,您确定是从0开始,还是希望根据它找到的第一个rowIndex或colIndex(而不是LastColIndex)开始,您可以通过某种方式获得列计数以使其更精确。如图A是2乘2单元格合并的。当我以这种方式将其转换为datatable时,这两行未合并,值转到上一个单元格,下一个单元格为空,所以第二行向左移动。我添加了一个例子。你能尝试一些不同的东西吗?我想粘贴进去,让你稍微修改一下你的代码。。每个foreach循环我都会有一个注释来解释下面代码中粘贴的okI,但是您必须要么将DataTable dt传递给您的方法,要么像下面所示那样创建它。试试看。。还要确保循环查看双精度值是什么,如果它们真的被转换为字符串,我也会用Try-Catch来包装代码,这样就可以捕获任何类型转换错误。谢谢。我试试看。请告诉我要在使用中添加什么。谢谢。我收到了旧格式或无效类型库的异常。来自HRESULT的异常:0x80028018 TYPE_E_INVDATAREAD,并且您已经声明了两次iCol。让我再次检查代码。。我有时讨厌在这里编辑。。我把我所有的东西都贴上了,效果很好。。你在哪一行收到错误信息。。这就是我的方法的样子excel.Workbook工作簿=excel.Application.Workbooks.Addtrue;在这里我有一个例外。我想你可能有一个文化问题看看这个链接。。这应该解决