Экспорт значений в Списке для выделений

Привет у меня есть контейнер списка, который содержит список значений. Я хочу экспортировать значения списка непосредственно в Excel. Там какой-либо путь состоит в том, чтобы сделать это непосредственно?

17
задан Michael Paulukonis 8 December 2011 в 15:44
поделиться

6 ответов

Хорошо, вот пошаговое руководство, если вы хотите использовать COM.

  1. У вас должен быть установлен Excel.
  2. Добавьте ссылку на ваш проект в библиотеку взаимодействия с Excel. Для этого на вкладке .NET выберите Microsoft.Office.Interop.Excel. Может быть несколько сборок с таким именем. Выберите , подходящий для вашей Visual Studio И версии Excel.
  3. Вот пример кода для создания новой книги и заполнения столбца элементами из вашего списка.

using NsExcel = Microsoft.Office.Interop.Excel;

public void ListToExcel(List<string> list)
{
    //start excel
    NsExcel.ApplicationClass excapp = new Microsoft.Office.Interop.Excel.ApplicationClass();

    //if you want to make excel visible           
    excapp.Visible = true;

    //create a blank workbook
    var workbook = excapp.Workbooks.Add(NsExcel.XlWBATemplate.xlWBATWorksheet);

    //or open one - this is no pleasant, but yue're probably interested in the first parameter
    string workbookPath = "C:\test.xls";
    var workbook = excapp.Workbooks.Open(workbookPath,
        0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
        true, false, 0, true, false, false);

    //Not done yet. You have to work on a specific sheet - note the cast
    //You may not have any sheets at all. Then you have to add one with NsExcel.Worksheet.Add()
    var sheet = (NsExcel.Worksheet)workbook.Sheets[1]; //indexing starts from 1

    //do something usefull: you select now an individual cell
    var range = sheet.get_Range("A1", "A1");
    range.Value2 = "test"; //Value2 is not a typo

    //now the list
    string cellName;
    int counter = 1;
    foreach (var item in list)
    {
        cellName = "A" + counter.ToString();
        var range = sheet.get_Range(cellName, cellName);
        range.Value2 = item.ToString();
        ++counter;
    }

    //you've probably got the point by now, so a detailed explanation about workbook.SaveAs and workbook.Close is not necessary
    //important: if you did not make excel visible terminating your application will terminate excel as well - I tested it
    //but if you did it - to be honest - I don't know how to close the main excel window - maybee somewhere around excapp.Windows or excapp.ActiveWindow
}
20
ответ дан 30 November 2019 в 10:36
поделиться

Самым простым способом (на мой взгляд) было бы просто собрать CSV-файл. Если вы хотите перейти к форматированию и на самом деле записать в файл *.xlsx, есть более сложные решения (и API), чтобы сделать это за вас.

1
ответ дан 30 November 2019 в 10:36
поделиться

Их можно вывести в файл .csv и открыть в excel. Этого достаточно прямолинейно?

2
ответ дан 30 November 2019 в 10:36
поделиться

один простой способ сделать это - открыть Excel, создать лист, содержащий тестовые данные, которые вы хотите экспортировать, а затем сказать, чтобы Excel сохранить как xml, открыть xml, увидеть формат XML, который ожидает Excel, и сгенерировать его головой, заменив тестовые данные на экспорт данных

SpreadsheetML Markup Spec

@lan это xml для простого файла execel с одним значением столбца, который я сгенерировал в Office 2003, этот формат предназначен для Office 2003 и выше

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>Dancho</Author>
  <LastAuthor>Dancho</LastAuthor>
  <Created>2010-02-05T10:15:54Z</Created>
  <Company>cc</Company>
  <Version>11.9999</Version>
 </DocumentProperties>
 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>13800</WindowHeight>
  <WindowWidth>24795</WindowWidth>
  <WindowTopX>480</WindowTopX>
  <WindowTopY>105</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
 </ExcelWorkbook>
 <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
   <Alignment ss:Vertical="Bottom"/>
   <Borders/>
   <Font/>
   <Interior/>
   <NumberFormat/>
   <Protection/>
  </Style>
 </Styles>
 <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="6" x:FullColumns="1"
   x:FullRows="1">
   <Row>
    <Cell><Data ss:Type="String">Value1</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value2</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value3</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value4</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value5</Data></Cell>
   </Row>
   <Row>
    <Cell><Data ss:Type="String">Value6</Data></Cell>
   </Row>
  </Table>
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <Selected/>
   <Panes>
    <Pane>
     <Number>3</Number>
     <ActiveRow>5</ActiveRow>
    </Pane>
   </Panes>
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet2">
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
 <Worksheet ss:Name="Sheet3">
  <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
   <ProtectObjects>False</ProtectObjects>
   <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
 </Worksheet>
</Workbook>
0
ответ дан 30 November 2019 в 10:36
поделиться

Используя идею CSV, если это просто список строк. Предположим, что l - это ваш список:

using System.IO;

using(StreamWriter sw = File.CreateText("list.csv"))
{
  for(int i = 0; i < l.Count; i++)
  {
    sw.WriteLine(l[i]);
  }
}
14
ответ дан 30 November 2019 в 10:36
поделиться

В зависимости от среды, в которой вы хотите это сделать, это можно сделать с помощью Excel Interop. Однако, это довольно запутанная работа с COM и обеспечение чистоты ресурсов, в противном случае Excel экземпляры остаются висеть на вашей машине.

Ознакомьтесь с этим Пример MSDN , если вы хотите узнать больше.

В зависимости от вашего формата вы можете самостоятельно создать CSV или SpreadsheetML, это не слишком сложно. Другой альтернативой является использование сторонних библиотек. Очевидно, что они стоят денег.

0
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: