2016-07-13 4 views
1

Итак, у меня есть список данных, которые я пытаюсь экспортировать в excel. Я просто хочу перечислить его в колонке 1, но он отказывается. Я изначально собирался использовать цикл foreach, но я беспокоился, что замедлит мою программу, и я не смогу использовать идею цикла for, которую я имел. У кого-нибудь есть хорошие идеи, чтобы просто импортировать это. Я чувствую, что это не должно быть так сложно, как я это делаю. Это то, что я сделал до сих пор. Заранее спасибо.Экспорт списка в Excel

if (dialog == DialogResult.Yes) 
{ 
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 
    Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet); 
    Worksheet ws = (Worksheet)excel.ActiveSheet; 

    ws.Cells[1, 1] = "Folder Names"; 
    for (int row = 0; row <= count; row++) 
    { 
     ws.Cells [1, row+2] = Namelist; 
    } 
    excel.Visible = true; 

} 

Я хочу пойти последовательно вниз по списку. (Код выше обыкновение экспортного списка имен, остальное работает, хотя)

список имена = список граф Int (это счетчик я начал в начале программы, чтобы определить количество строк списка имен)

+1

Какая переменная 'Namelist'? – RePierre

+1

Является ли это импортом для exisitng файла excel или вы просто хотите создать новый файл с информацией в нем? – ata

+0

все ячейки должны иметь одинаковое значение (namelist)? – Veverke

ответ

1

цикл for не замедлит вашу программу, но доступ к клеткам Individ будет. Каждый вызов Cells является вызовом COM-interop, что относительно дорого. Это гораздо быстрее поместить данные в массиве, определить Range, который представляет весь спектр продукции, и установить Value там:

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 
    var wbs = excel.Workbooks; 
    Workbook wb = wbs.Add(XlSheetType.xlWorksheet); 
    Worksheet ws = (Worksheet)excel.ActiveSheet; 

    List<object> data = new List<object> 

    data.Add("Folder Names"); 
    for (int row = 0; row <= count; row++) 
    { 
     data.Add(Namelist); 
    } 

    Excel.Range rng = (Excel.Range)ws.Range[ws.Cells[1, 1], ws.Cells[1,count + 2]]; 
    rng.Value = data.ToArray(); 
    excel.Visible = true; 
+0

, так что, если бы я хотел адаптировать это для текста в отдельном текстовом поле, которое не входит в список любого рода, могу ли я следовать этому по большей части? – Tasha

+0

Я не уверен, что вы имеете в виду, но моя точка не устанавливает значения cell-by-cell - помещает данные в массив и устанавливает значение _range_ в массив. –

+0

В какой библиотеке вы используете excel, для меня не подходит ключевое слово. Кроме того, я хотел сказать, что у меня была другая информация, которую я также хотел записать в файл excel. Но я думаю, что теперь понимаю, что вы имели в виду, используя диапазон – Tasha

0

Допуская Namelist является string[] или List<string>, что теряешь является извлечение каждого элемента из коллекции Namelist перед установкой значения каждой ячейки:

ws.Cells[1, 1] = @"Folder names"; 
for(int row = 2; row <= count; row ++) 
{ 
    var name = Namelist[row-2]; 
    ws.Cells[1, row] = name; 
} 
0

При использовании Cells свойства первого аргументом является строкой, второй - столбец. Вы отменили его.

Кроме того, если вы не зашли слишком далеко по пути изучения Excel interop, я бы переключился на EPPlus. Это в 100 раз легче работать, не связано с запуском COM-объектов и даже не требует Excel. Это просто лучше.

2

Если это List<string> списке имен, самый простой способ, чтобы скопировать его в буфер обмена:

var text = "Folder Names\n" + string.Join("\n", Namelist); // or "\r\n" 
System.Windows.Forms.Clipboard.SetText(text); 

var xl = new Microsoft.Office.Interop.Excel.Application(); 
var wb = xl.Workbooks.Add(); 
var ws = xl.ActiveSheet as Worksheet; 
ws.Range("A1").PasteSpecial(); 
xl.Visible = true; 

или даже проще, потому что Excel связан с CSV-файлов по умолчанию:

var fileName = @"list.csv"; // or change to .xls and get warning message box 
System.IO.File.WriteAllText(fileName, "Folder Names\n" + string.Join("\n", Namelist)); 
System.Diagnostics.Process.Start(fileName); 

Update

CSV означает значения, разделенные запятыми, поэтому, если вы хотите, чтобы список находился в другом столбце, вам нужно добавьте запятые перед значениями.Например, в колонках 2 и 4:

,Folder Names,,Folder Size 
,name1,,256 
,name2,,"1,024" 

Если у вас есть 2 списков с того же размера, вы можете сжать их вместе:

string[] names = {"name1", "name2"}; 
int[] sizes = {256, 1024}; 

var lines = names.Zip(sizes, (name, size) => name + "," + size); // {"name1,256", "name2,1024"} 
var csv = "Names,Sizes\n" + string.Join("\n", lines); 
+0

, поэтому скажем, что я хочу вставить его в определенный столбец, вы бы отрегулировали активную ячейку – Tasha

+0

Конечно, вы можете указать адрес, как 'ws.Range (" A1 ") 'где A - это имя столбца – Slai

+0

Итак, скажем, что я использую версию .csv-файла, как бы вы отрегулировали адрес, так как вы не сможете использовать рабочий лист – Tasha

0

Супер легкий способ экспортировать список Excel с помощью C#

Как установить ClosedXML с консолью менеджера пакетов NuGet: PM> Get-Project [имя_проекта] | Install-Package ClosedXML

 using (var conn = new DB.Entities()) 
     { 
      var stories = (from a in conn.Subscribers 
          orderby a.DT descending 
          select a).Take(100).ToList(); 

      var ShowHeader = true; 
      PropertyInfo[] properties = stories.First().GetType().GetProperties(); 
      List<string> headerNames = properties.Select(prop => prop.Name).ToList();     
      var wb = new XLWorkbook(); 
      var ws = wb.Worksheets.Add("Subscribers"); 
      if (ShowHeader) 
      { 
       for (int i = 0; i < headerNames.Count; i++)      
        ws.Cell(1, i + 1).Value = headerNames[i]; 

       ws.Cell(2, 1).InsertData(stories); 
      } 
      else 
      { 
       ws.Cell(1, 1).InsertData(stories); 
      } 

      wb.SaveAs(@"C:\Testing\yourExcel.xlsx"); 
     }