Как открыть csv в excel на C#?
От: bmooh  
Дата: 15.06.16 13:02
Оценка:
Нужно скопировать из 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();

Столбцы есть, но проблема — крякозябры, кодировка не та русских букв не видит.
Отредактировано 22.06.2016 18:37 VladD2 . Предыдущая версия .
Re: Как открыть csv в excel на C#?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 15.06.16 13:52
Оценка: +1
Здравствуйте, bmooh, Вы писали:

B>Нужно скопировать из CSV в книгу Excel. Причем количество строк может быть весьма большим и там есть строки на русском языке. Пока удается нормально работать только одному варианту:

Несколько уточняющих вопросов:

Ну и ещё уточню — а вы пробовали эти csv загрузить средствами самого Excel (т.е. не программно). В 2013/2016 Excel это закладка "Data", кнопка "From Text"? Получилось ли загрузить так и устраивает ли скорость такой загрузки?
Re[2]: Как открыть csv в excel на C#?
От: bmooh  
Дата: 15.06.16 13:58
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Ну и ещё уточню — а вы пробовали эти csv загрузить средствами самого Excel (т.е. не программно). В 2013/2016 Excel это закладка "Data", кнопка "From Text"? Получилось ли загрузить так и устраивает ли скорость такой загрузки?


Нет. Я пишу отдельное приложение в котором нужно из готового csv (генерится определенным perl-скриптом) получить в ячейки чтобы потом скопировать в другую книгу. Стркутура csv фиксированна известна заранее.

Вот если Worksheet.Querytables использовать как там задать что файл в win-1251 ? Пока видится мне единственным вменяемым способом.
Отредактировано 22.06.2016 18:39 VladD2 . Предыдущая версия . Еще …
Отредактировано 22.06.2016 18:38 VladD2 . Предыдущая версия .
Re: Как открыть csv в excel на C#?
От: nikda  
Дата: 15.06.16 15:09
Оценка:
Здравствуйте, bmooh, Вы писали:

Нужно подготовить двумерный массив
object[,] data
, выделить нужный Range в EXCEL и присвоить свойству value (или Value2) этот двумерный массив.
Это самое быстрое.
Re[3]: Как открыть csv в excel на C#?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 15.06.16 15:32
Оценка: +1
Здравствуйте, bmooh, Вы писали:

B>Вот если Worksheet.Querytables использовать как там задать что файл в win-1251 ? Пока видится мне единственным вменяемым способом.

Если я правильно понимаю, то через свойство TextFilePlatform
Т.е. строчку в вашем последнем примере
WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 437;
надо заменить на
WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 1251;


А вообще рекомендую вместо выискивания нюансов по документации просто запустить в Excel запись макросов, настроить импорт, запустить, а потом посмотреть, что записалось в макросе.
Re[3]: Как открыть csv в excel на C#?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 15.06.16 15:51
Оценка:
Здравствуйте, bmooh, Вы писали:

B>Нет. Я пишу отдельное приложение в котором нужно из готового csv (генерится определенным perl-скриптом) получить в ячейки чтобы потом скопировать в другую книгу. Стркутура csv фиксированна известна заранее.

Ну тогда смотрите и выбирайте:

Ну и попробуйте вариант, который посоветовал коллега nikda
Автор: nikda
Дата: 15.06.16
. Я так с Excel никогда не работал, но идея кажется разумной, т.к. везде основным источником торможения при манипуляции Excel называется работа через COM и Interop
Re: Как открыть csv в excel на C#?
От: Vladek Россия Github
Дата: 15.06.16 18:57
Оценка: +2
Здравствуйте, bmooh, Вы писали:

B>Нужно скопировать из CSV в книгу Excel. Причем количество строк может быть весьма большим и там есть строки на русском языке. Пока удается нормально работать только одному варианту:


CsvHelper + EPPlus? Будет быстро и просто.
Re[4]: Как открыть csv в excel на C#?
От: bmooh  
Дата: 16.06.16 06:57
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, bmooh, Вы писали:


B>>Вот если Worksheet.Querytables использовать как там задать что файл в win-1251 ? Пока видится мне единственным вменяемым способом.

МР>Если я правильно понимаю, то через свойство TextFilePlatform
МР>Т.е. строчку в вашем последнем примере
МР>
МР>WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 437;
МР>
надо заменить на

МР>
МР>WorkBookUpload.Worksheets[1].QueryTables[1].TextFilePlatform = 1251;
МР>


МР>А вообще рекомендую вместо выискивания нюансов по документации просто запустить в Excel запись макросов, настроить импорт, запустить, а потом посмотреть, что записалось в макросе.


Спасибо. Это помогло.
Re: Как открыть csv в excel на C#?
От: MaLS Россия https://github.com/maliutin
Дата: 16.06.16 11:41
Оценка:
Здравствуйте, bmooh, Вы писали:

B>Нужно скопировать из CSV в книгу Excel. Причем количество строк может быть весьма большим и там есть строки на русском языке. Пока удается нормально работать только одному варианту:

Можете попробовать CSV 4180. Это расширение для Excel, которое позволяет открывать cvs согласно RFC 4180.

Далее можно сделать так:
using System;
using System.Runtime.InteropServices;

using Microsoft.Office.Interop.Excel;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Application excel = new Application();
            excel.DisplayAlerts = false;

            try
            {

                Object[,] fileConverters = (Object[,])excel.FileConverters[Type.Missing, Type.Missing];

                int converterIndex = 0;
                for (converterIndex = 1; converterIndex <= fileConverters.GetLength(0); converterIndex++)
                {
                    String convertName = (String)fileConverters[converterIndex, 1];

                    if(convertName.StartsWith("CSV [RFC 4180]"))
                        break;
                }

                if (converterIndex == 0)
                    throw new ApplicationException("The convert was not found.");

                Workbook workbook = excel.Workbooks.Open(Filename: @"01_total.csv", Converter: converterIndex);

                Worksheet objExcelWorksheet = (Worksheet)excel.Workbooks[1].Sheets[1];

                if (objExcelWorksheet != null)
                {
                    int rowCount = objExcelWorksheet.UsedRange.Rows.Count;
                    int columnCount = objExcelWorksheet.UsedRange.Columns.Count;

                    for (Int32 rowIndex = 1; rowIndex < rowCount + 1; rowIndex++)
                    for (int columnIndex = 1; columnIndex < columnCount + 1; columnIndex++)
                    {
                        Range range = (Range)objExcelWorksheet.Cells[rowIndex, columnIndex];

                        if (range.Value != null)
                        {
                            Console.WriteLine(range.Value);
                        }
                    }
                }
            }
            finally
            {
                try
                {
                    excel.Application.Quit();
                }
                catch
                {

                }

                try
                {
                    excel.Quit();
                }
                catch
                {

                }
                Marshal.FinalReleaseComObject(excel);
            }
        }
    }
}
----
"Ответить на вопрос — значит согласиться с правильностью его постановки.", Карстен Бредемайер
Re[2]: Как открыть csv в excel на C#?
От: Privalov  
Дата: 16.06.16 11:55
Оценка:
Здравствуйте, MaLS, Вы писали:

MLS>Далее можно сделать так:


Это может работать долго. Я делал так:

xlApp.Workbooks.OpenText(Filename: cvsName,
                Origin: 1251,
                DataType: XlTextParsingType.xlDelimited,
                Tab: false,
                Comma: true,
                FieldInfo: dataTypes);
xlApp.ActiveWorkbook.SaveAs(Filename: excelFileName,
                FileFormat: XlFileFormat.XlExcel8,
                AccessMode: Excel.XlSaveAsAccessMode.xlNoChange,
                AddToMru: false,
                ConflictResolution: XlSaveConflictResolution.xlLocalSessionChanged);


И нужно только смотреть, чтобы исходный csv был не слишком большим. А то как-то попало что-то на 3 млн строк.
Re[4]: Как открыть csv в excel на C#?
От: bnk СССР http://unmanagedvisio.com/
Дата: 16.06.16 23:12
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

B>>Нет. Я пишу отдельное приложение в котором нужно из готового csv (генерится определенным perl-скриптом) получить в ячейки чтобы потом скопировать в другую книгу. Стркутура csv фиксированна известна заранее.


МР>Ну тогда смотрите и выбирайте:


Чего тут думать, трясти надо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.