перевод из C # в Excel с несколькими листами

1

У меня есть несколько разных словарей с различными категориями информации, и мне нужно вывести их все в файл xls или csv с несколькими электронными таблицами. В настоящее время я должен загружать каждый файл excel для определенного диапазона дат в отдельности, а затем копировать и вставлять их вместе, чтобы они находились на разных листах того же файла. Есть ли способ загрузить их все вместе в одном документе? В настоящее время я использую следующий код для вывода своих файлов:

 writeCsvToStream(
     organize.ToDictionary(k => k.Key, v => v.Value as IacTransmittal), writer
 );
 ms.Seek(0, SeekOrigin.Begin);
 Response.Clear();
 Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
 Response.AddHeader("Content-Length", ms.Length.ToString());
 Response.ContentType = "application/octet-stream";
 ms.CopyTo(Response.OutputStream);

 Response.End();

где writeCsvToStream просто создает текст для отдельного файла.

Теги:
csv
dictionary
export
xls

3 ответа

0
Лучший ответ

Если вы открыты для изучения новой библиотеки, я настоятельно рекомендую EPPlus.

Я делаю несколько предположений здесь, так как вы не отправляли много кода для перевода, но пример использования может выглядеть следующим образом:

using OfficeOpenXml;
using OfficeOpenXml.Style;

public static void WriteXlsOutput(Dictionary<string, IacTransmittal> collection) //accepting one dictionary as a parameter
{
    using (FileStream outFile = new FileStream("Example.xlsx", FileMode.Create))
    {
        using (ExcelPackage ePackage = new ExcelPackage(outFile))
        {
            //group the collection by date property on your class
            foreach (IGrouping<DateTime, IacTransmittal> collectionByDate in collection
                .OrderBy(i => i.Value.Date.Date)
                .GroupBy(i => i.Value.Date.Date)) //assuming the property is named Date, using Date property of DateTIme so we only create new worksheets for individual days
            {
                ExcelWorksheet eWorksheet = ePackage.Workbook.Worksheets.Add(collectionByDate.Key.Date.ToString("yyyyMMdd")); //add a new worksheet for each unique day

                Type iacType = typeof(IacTransmittal);
                PropertyInfo[] iacProperties = iacType.GetProperties();
                int colCount = iacProperties.Count(); //number of properties determines how many columns we need
                //set column headers based on properties on your class
                for (int col = 1; col <= colCount; col++)
                {
                    eWorksheet.Cells[1, col].Value = iacProperties[col - 1].Name ; //assign the value of the cell to the name of the property
                }

                int rowCounter = 2;

                foreach (IacTransmittal iacInfo in collectionByDate) //iterate over each instance of this class in this igrouping
                {
                    int interiorColCount = 1;
                    foreach (PropertyInfo iacProp in iacProperties) //iterate over properties on the class
                    {
                        eWorksheet.Cells[rowCounter, interiorColCount].Value = iacProp.GetValue(iacInfo, null); //assign cell values by getting the value of each property in the class
                        interiorColCount++;
                    }
                    rowCounter++;
                }
            }
            ePackage.Save();
        }
    }
}
1

Есть несколько вариантов, которые вы могли бы использовать.

  • Драйвер ADO.NET Excel - с помощью этого API вы можете заполнять данные в документах Excel с помощью синтаксиса SQL-стиля. Каждый рабочий лист в книге представляет собой таблицу, каждый заголовок столбца на листе - это столбец в этой таблице и т.д.

Вот статья проекта кода по экспорту в Excel с использованием ADO.NET: http://www.codeproject.com/Articles/567155/Work-with-MS-Excel-and-ADO-NET

Подход ADO.NET безопасен для использования в многопользовательской среде веб-приложений.

  • Используйте OpenXML для экспорта данных. OpenXML - это определение схемы для разных типов документов и более поздних версий Excel (те, которые используют.xlsx,.xlsm и т.д., А не только.xls) используют этот формат для документов. Схема OpenXML огромна и несколько громоздка, однако вы можете делать с ней что угодно.

Вот статья проекта кода для экспорта данных в Excel с помощью OpenXML: http://www.codeproject.com/Articles/692121/Csharp-Export-data-to-Excel-using-OpenXML-librarie

OpenXML-подход безопасен для использования в многопользовательской среде веб-приложений.

  • Третий подход заключается в использовании автоматизации COM, которая аналогична программному запуску экземпляра рабочего стола Excel и использованию COM для управления действиями этого экземпляра.

Вот статья по этой теме: http://support.microsoft.com/kb/302084

Обратите внимание, что этот третий подход (автоматизация офиса) небезопасен в многопользовательской среде веб-приложений. Т.е. его нельзя использовать на сервере, только из автономных настольных приложений.

0

Спасибо за идеи! В конце концов я смог выяснить следующее

using Excel = Microsoft.Office.Interop.Excel;


Excel.Application ExcelApp = new Excel.Application();
Excel.Workbook ExcelWorkBook = null;
Excel.Worksheet ExcelWorkSheet = null;

ExcelApp.Visible = true;
ExcelWorkBook = ExcelApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);

List<string> SheetNames = new List<string>() 
    { "Sheet1", "Sheet2", "Sheet3", "Sheet4", "Sheet5", "Sheet6", "Sheet7"};

string [] headers = new string [] 
    { "Field 1", "Field 2", "Field 3", "Field 4", "Field 5" };

for (int i = 0; i < SheetNames.Count; i++)
    ExcelWorkBook.Worksheets.Add(); //Adding New sheet in Excel Workbook

for (int k = 0; k < SheetNames.Count; k++ )
{
    int r = 1; // Initialize Excel Row Start Position  = 1

    ExcelWorkSheet = ExcelWorkBook.Worksheets[k + 1];
    //Writing Columns Name in Excel Sheet
    for (int col = 1; col < headers.Length + 1; col++)
        ExcelWorkSheet.Cells[r, col] = headers[col - 1];
    r++;
    switch (k)
    {
        case 0:
            foreach (var kvp in Sheet1)
            {
                ExcelWorkSheet.Cells[r, 1] = kvp.Value.Field1;
                ExcelWorkSheet.Cells[r, 2] = kvp.Value.Field2;
                ExcelWorkSheet.Cells[r, 3] = kvp.Value.Field3;
                ExcelWorkSheet.Cells[r, 4] = kvp.Value.Field4;
                ExcelWorkSheet.Cells[r, 5] = kvp.Value.Field5;
                r++;
            }
            break;

    }
    ExcelWorkSheet.Name = SheetNames[k];//Renaming the ExcelSheets
}

//Activate the first worksheet by default.
((Excel.Worksheet)ExcelApp.ActiveWorkbook.Sheets[1]).Activate();

//Save As the excel file.
ExcelApp.ActiveWorkbook.SaveCopyAs(@"out_My_Book1.xls");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню