Информация об изменениях

Сообщение Как открыть csv в excel на C#? от 15.06.2016 13:02

Изменено 22.06.2016 18:37 VladD2

Нужно скопировать из CSV в книгу Excel. Причем количество строк может быть весьма большим и там есть строки на русском языке. Пока удается нормально работать только одному варианту:
DataTable csvData = new DataTable();
                using (TextFieldParser csvReader = new TextFieldParser(this.out_file, Encoding.GetEncoding(1251)))
                 {
                    
                    csvReader.SetDelimiters(new string[] { ";" });
                    csvReader.HasFieldsEnclosedInQuotes = true;                    
                    //read column names
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add();
                    }
                    int strnum = 2;
                    while (!csvReader.EndOfData)
                    {
                        if (this.backgroundWorker1.CancellationPending)
                            return;
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (this.backgroundWorker1.CancellationPending)
                                return;

                            WS_mergexls.Cells[i + 1][strnum] = fieldData[i];                            
                        }
                        strnum++;
                    }


                }

Но уж больно долго этот код выполняется.
Пробую просто открыть книгу
App.Workbooks.OpenText(out_file,
                                                   Excel.XlPlatform.xlWindows,
                                                   1,
                                                   Excel.XlTextParsingType.xlDelimited,
                                                   Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                                                   true,           //Разделители одинарные
                                                   false,          //Разделители :Tab
                                                   true,           //Semicolon
                                                   false,          //Comma
                                                   false,          //Space
                                                   false,          //Other
                                                   Type.Missing,   //OtherChar
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing);

                Microsoft.Office.Interop.Excel.Worksheet objExcelWorksheet = App.Workbooks[1].Sheets[1];

                if (objExcelWorksheet != null)
                {
                    int columnCount = objExcelWorksheet.UsedRange.Columns.Count;
                    for (int i = 1; i < columnCount + 1; i++)
                    {
                        if (objExcelWorksheet.Cells[1, i].Value != null)
                        {
                            if (!lstColumnsNames.Contains(objExcelWorksheet.Cells[1, i].Value.ToString()))
                                lstColumnsNames.Add(objExcelWorksheet.Cells[1, i].Value.ToString());
                        }
                    }
                }

Упрямо не хочет создавать строки

Через создание именной таблицы:
WorkBookUpload.Worksheets[1].QueryTables.Add("TEXT;" + Path.GetFullPath(out_file), // $A$2
            (Excel.Range)(((Excel.Worksheet)WorkBookUpload.Worksheets[1]).get_Range("$A$2")), Type.Missing);                
                WorkBookUpload.Worksheets[1].QueryTables[1].Name = Path.GetFileNameWithoutExtension(out_file);
                WorkBookUpload.Worksheets[1].QueryTables[1].FieldNames = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RowNumbers = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].FillAdjacentFormulas = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].PreserveFormatting = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshOnFileOpen = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells; //XlCellInsertionModel//.xlInsertDeleteCells;
                WorkBookUpload.Worksheets[1].QueryTables[1].SavePassword = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].SaveData = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].AdjustColumnWidth = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshPeriod = 0;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePromptOnRefresh = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 437;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileStartRow = 1;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileParseType = Excel.XlTextParsingType.xlDelimited;// XlTextParsingType.xlDelimited;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileTextQualifier = Excel.XlTextQualifier.xlTextQualifierDoubleQuote;// XlTextQualifier.xlTextQualifierDoubleQuote;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileConsecutiveDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileTabDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileSemicolonDelimiter = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileCommaDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileSpaceDelimiter = false;
              //  WorkBookUpload.Worksheets[1].QueryTables[1].TextFileColumnDataTypes = columnDataTypes;

                //Logger.GetInstance().WriteLog("Importing data...");
                WorkBookUpload.Worksheets[1].QueryTables[1].Refresh(false);

                
                WorkBookUpload.Worksheets[1].QueryTables[1].Destination.EntireColumn.AutoFit();

Столбцы есть, но проблема — крякозябры, кодировка не та русских букв не видит.
Как открыть csv в excel на C#?
Нужно скопировать из CSV в книгу Excel. Причем количество строк может быть весьма большим и там есть строки на русском языке. Пока удается нормально работать только одному варианту:
DataTable csvData = new DataTable();
using (TextFieldParser csvReader = new TextFieldParser(this.out_file, Encoding.GetEncoding(1251)))
{
    
  csvReader.SetDelimiters(new string[] { ";" });
  csvReader.HasFieldsEnclosedInQuotes = true;                    
  //read column names
  string[] colFields = csvReader.ReadFields();
  foreach (string column in colFields)
  {
      DataColumn datecolumn = new DataColumn(column);
      datecolumn.AllowDBNull = true;
      csvData.Columns.Add();
  }
  int strnum = 2;
  while (!csvReader.EndOfData)
  {
      if (this.backgroundWorker1.CancellationPending)
          return;
      string[] fieldData = csvReader.ReadFields();
      //Making empty value as null
      for (int i = 0; i < fieldData.Length; i++)
      {
          if (this.backgroundWorker1.CancellationPending)
              return;

          WS_mergexls.Cells[i + 1][strnum] = fieldData[i];                            
      }
      strnum++;
  }
}

Но уж больно долго этот код выполняется.
Пробую просто открыть книгу
App.Workbooks.OpenText(out_file,
                                                   Excel.XlPlatform.xlWindows,
                                                   1,
                                                   Excel.XlTextParsingType.xlDelimited,
                                                   Excel.XlTextQualifier.xlTextQualifierDoubleQuote,
                                                   true,           //Разделители одинарные
                                                   false,          //Разделители :Tab
                                                   true,           //Semicolon
                                                   false,          //Comma
                                                   false,          //Space
                                                   false,          //Other
                                                   Type.Missing,   //OtherChar
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing,
                                                   Type.Missing);

                Microsoft.Office.Interop.Excel.Worksheet objExcelWorksheet = App.Workbooks[1].Sheets[1];

                if (objExcelWorksheet != null)
                {
                    int columnCount = objExcelWorksheet.UsedRange.Columns.Count;
                    for (int i = 1; i < columnCount + 1; i++)
                    {
                        if (objExcelWorksheet.Cells[1, i].Value != null)
                        {
                            if (!lstColumnsNames.Contains(objExcelWorksheet.Cells[1, i].Value.ToString()))
                                lstColumnsNames.Add(objExcelWorksheet.Cells[1, i].Value.ToString());
                        }
                    }
                }

Упрямо не хочет создавать строки

Через создание именной таблицы:
WorkBookUpload.Worksheets[1].QueryTables.Add("TEXT;" + Path.GetFullPath(out_file), // $A$2
            (Excel.Range)(((Excel.Worksheet)WorkBookUpload.Worksheets[1]).get_Range("$A$2")), Type.Missing);                
                WorkBookUpload.Worksheets[1].QueryTables[1].Name = Path.GetFileNameWithoutExtension(out_file);
                WorkBookUpload.Worksheets[1].QueryTables[1].FieldNames = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RowNumbers = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].FillAdjacentFormulas = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].PreserveFormatting = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshOnFileOpen = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells; //XlCellInsertionModel//.xlInsertDeleteCells;
                WorkBookUpload.Worksheets[1].QueryTables[1].SavePassword = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].SaveData = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].AdjustColumnWidth = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].RefreshPeriod = 0;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePromptOnRefresh = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 437;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileStartRow = 1;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileParseType = Excel.XlTextParsingType.xlDelimited;// XlTextParsingType.xlDelimited;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileTextQualifier = Excel.XlTextQualifier.xlTextQualifierDoubleQuote;// XlTextQualifier.xlTextQualifierDoubleQuote;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileConsecutiveDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileTabDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileSemicolonDelimiter = true;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileCommaDelimiter = false;
                WorkBookUpload.Worksheets[1].QueryTables[1].TextFileSpaceDelimiter = false;
              //  WorkBookUpload.Worksheets[1].QueryTables[1].TextFileColumnDataTypes = columnDataTypes;

                //Logger.GetInstance().WriteLog("Importing data...");
                WorkBookUpload.Worksheets[1].QueryTables[1].Refresh(false);

                
                WorkBookUpload.Worksheets[1].QueryTables[1].Destination.EntireColumn.AutoFit();

Столбцы есть, но проблема — крякозябры, кодировка не та русских букв не видит.