Преобразование этого Excel в Dataatable - PullRequest
0 голосов
/ 30 января 2012

Ранее я преуспел в преобразовании 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 Итак, любая помощь о том, как решить эту проблему, более чем приветствуется. Спасибо.

Ответы [ 3 ]

1 голос
/ 30 января 2012

Ссылочная ссылка, с которой у кого-то возникла та же проблема, и способы ее устранения.

Как устранить параметры культуры проблемы Exce.Interop

Ошибказаключается в том, что .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");
0 голосов
/ 30 октября 2014

Вы можете получить его, не открывая

использовать «Макрос Excel 12.0» вместо «Excel 12.0» только для файла xlsm

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
0 голосов
/ 30 января 2012

введите в верхнюю часть файла .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();
        }
...