Как создать таблицу Excel с помощью С#, не требуя установки Excel на компьютере с кодом?
Вы можете использовать библиотеку под названием ExcelLibrary. Это бесплатная библиотека с открытым исходным кодом, размещенная в Google Code:
Это выглядит как порт PHP ExcelWriter, который вы упомянули выше. Он пока не будет писать в новый формат .xlsx, но они работают над добавлением этой функциональности в.
Это очень просто, маленький и простой в использовании. Кроме того, он имеет DataSetHelper, который позволяет вам использовать DataSets и DataTables для простой работы с данными Excel.
Кажется, что ExcelLibrary все еще работает только для старого формата Excel (файлы .xls), но в будущем может добавить поддержку для новых форматов 2007/2010.
Вы также можете использовать EPPlus, который работает только для файлов формата Excel 2007/2010 (файлы .xlsx). Там также NPOI, который работает с обоими.
Есть несколько известных ошибок с каждой библиотекой, как отмечено в комментариях. В целом, EPPlus кажется лучшим выбором с течением времени. Кажется, что он также более активно обновляется и документируется.
Кроме того, как отметил @АртёмЦарионов ниже, EPPlus имеет поддержку сводных таблиц, а ExcelLibrary может иметь некоторую поддержку (проблема сводных таблиц в ExcelLibrary)
Вот несколько ссылок для быстрого ознакомления:
ExcelLibrary - GNU Lesser GPL
EPPlus - GNU Lesser General Public License (LGPL)
НКОИ - Лицензия Apache
Вот пример кода для ExcelLibrary:
Вот пример получения данных из базы данных и создания из нее рабочей книги. Обратите внимание, что код ExcelLibrary - это одна строка внизу:
//Create the data set and table
DataSet ds = new DataSet("New_DataSet");
DataTable dt = new DataTable("New_DataTable");
//Set the locale for each
ds.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
dt.Locale = System.Threading.Thread.CurrentThread.CurrentCulture;
//Open a DB connection (in this example with OleDB)
OleDbConnection con = new OleDbConnection(dbConnectionString);
con.Open();
//Create a query and fill the data table with the data from the DB
string sql = "SELECT Whatever FROM MyDBTable;";
OleDbCommand cmd = new OleDbCommand(sql, con);
OleDbDataAdapter adptr = new OleDbDataAdapter();
adptr.SelectCommand = cmd;
adptr.Fill(dt);
con.Close();
//Add the table to the data set
ds.Tables.Add(dt);
//Here the easy part. Create the Excel worksheet from the data set
ExcelLibrary.DataSetHelper.CreateWorkbook("MyExcelFile.xls", ds);
Создать файл Excel так просто. Вы также можете вручную создавать файлы Excel, но вышеперечисленные функции меня поразили.
Если вы довольны xlsx-форматом, попробуйте проект codeplex GitHub. EPPlus. Начал его с источника из ExcelPackage, но сегодня он переписывается.
Поддерживает диапазоны, стили ячейки, диаграммы, фигуры, рисунки, namesranges, автофильтр и множество других вещей.
А как насчет использования Open XML SDK 2.0 для Microsoft Office?
Несколько преимуществ:
Ссылки:
Я успешно использовал следующие проекты с открытым исходным кодом:
ExcelPackage для форматов OOXML (Office 2007)
NPOI для формата.XLS(Office 2003). NPOI 2.0 (Alpha) также поддерживает XLSX.
Взгляните на мои сообщения в блоге:
Вы можете использовать OLEDB для создания и обработки файлов Excel. Проверьте это: Чтение и запись Excel с помощью OLEDB.
Типичный пример:
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\temp\\test.xls;Extended Properties='Excel 8.0;HDR=Yes'"))
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("CREATE TABLE [Sheet1] ([Column1] string, [Column2] string)", conn);
cmd.ExecuteNonQuery();
}
EDIT - Еще несколько ссылок:
Коммерческое решение, SpreadsheetGear для .NET сделает это.
Вы можете увидеть живые образцы ASP.NET (С# и VB) здесь и скачать ознакомительную версию здесь.
Отказ от ответственности: я владею SpreadsheetGear LLC
Несколько вариантов, которые я использовал:
Если XLSX является обязательным: ExcelPackage - хороший старт, но он умер, когда разработчик прекратил работать над ним. ExML поднялся оттуда и добавил несколько функций. ExML не является плохим вариантом, я все еще использую его на нескольких веб-сайтах.
Тем не менее, для всех моих новых проектов я использую NPOI, порт.NET Apache POI. NPOI 2.0 (Alpha) также поддерживает XLSX.
Очень легкая опция может заключаться в использовании таблиц HTML. Просто создайте теги head, body и table в файле и сохраните его как файл с расширением .xls. Существуют специальные атрибуты Microsoft, которые можно использовать для создания вывода, включая формулы.
Я понимаю, что вы не можете кодировать это в веб-приложении, но вот пример композиции файла Excel через HTML-таблица. Этот метод можно использовать, если вы кодировали консольное приложение, настольное приложение или службу.
Вы можете использовать ExcelXmlWriter.
Работает нормально.
Если вы создаете файлы Excel 2007/2010, попробуйте этот проект с открытым исходным кодом: https://github.com/closedxml/closedxml
Он обеспечивает объектно-ориентированный способ манипулирования файлами (аналогично VBA), не имея дело с проблемами XML-документов. Он может использоваться любым языком.NET, таким как С# и Visual Basic (VB).
ClosedXML позволяет создавать файлы Excel 2007/2010 без приложения Excel. Типичным примером является создание отчетов Excel на веб-сервере:
var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sample Sheet"); worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx");
Вы действительно можете проверить классы взаимодействия. Вы не говорите OLE (что это не так), но классы взаимодействия очень просты в использовании.
Вы можете быть впечатлены, если вы их не пробовали.
Пожалуйста, будьте предупреждены о позиции Microsoft по этому вопросу:
Microsoft в настоящее время не рекомендует и не поддерживает автоматизацию приложений Microsoft Office от любого бездействия, неинтерактивного клиентского приложения или компонента (включая ASP, ASP.NET, DCOM и NT Services), поскольку Office может проявлять нестабильное поведение и/или тупиковой ситуации, когда Office запущен в этой среде.
Здесь полностью бесплатная библиотека С#, которая позволяет экспортировать из DataSet
, DataTable
или List<>
в подлинный файл Excel.xlsx Excel 2007. Использование библиотек OpenXML:
http://mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm
Полный исходный код предоставляется - бесплатно - вместе с инструкциями и демонстрационным приложением.
После добавления этого класса в приложение вы можете экспортировать свой DataSet в Excel только в одной строке кода:
CreateExcelFile.CreateExcelDocument(myDataSet, "C:\\Sample.xlsx");
Это не намного проще, чем это...
И это даже не требует наличия Excel на вашем сервере.
Вы можете подумать о создании своих файлов, используя формат XML Spreadsheet 2003. Это простой XML-формат с использованием хорошо документированной схемы.
Syncfusion Essential XlsIO может это сделать. Он не зависит от офиса Microsoft, а также имеет определенную поддержку для разных платформ.
Пример кода:
//Creates a new instance for ExcelEngine.
ExcelEngine excelEngine = new ExcelEngine();
//Loads or open an existing workbook through Open method of IWorkbooks
IWorkbook workbook = excelEngine.Excel.Workbooks.Open(fileName);
//To-Do some manipulation|
//To-Do some manipulation
//Set the version of the workbook.
workbook.Version = ExcelVersion.Excel2013;
//Save the workbook in file system as xlsx format
workbook.SaveAs(outputFileName);
Весь набор средств управления предоставляется бесплатно через лицензионную программу сообщества, если вы имеете право на получение дохода (менее 1 миллиона долларов США). Примечание. Я работаю в Syncfusion.
Вы можете взглянуть на GemBox.Spreadsheet.
У них есть бесплатная версия со всеми функциями, но она ограничена до 150 строк на лист и 5 листов на книгу, если это подпадает под ваши потребности.
Мне еще не нужно было его использовать, но это интересно.
OpenXML также является хорошей альтернативой, которая помогает избежать установки MS Excel на сервере. Open XML SDK 2.0, предоставляемый Microsoft, упрощает задачу управления пакетами Open XML и базовыми элементами схемы Open XML в пакете. Интерфейс прикладного программирования Open XML (API) инкапсулирует многие общие задачи, которые разработчики выполняют в пакетах Open XML.
Отметьте OpenXML: Альтернатива, которая помогает избежать установки MS Excel на сервере
Ну,
вы также можете использовать стороннюю библиотеку, например Aspose.
Эта библиотека имеет то преимущество, что на вашем компьютере не будет установлен Excel, который был бы идеальным в вашем случае.
Просто хочу добавить другую ссылку на стороннее решение, которое напрямую решает вашу проблему: http://www.officewriter.com
(Отказ от ответственности: я работаю для SoftArtisans, компании, которая делает OfficeWriter)
Различные библиотеки библиотек Office 2003 доступны для небольших файлов excel. Тем не менее, я считаю, что размер большой книги, сохраненной в формате XML, является проблемой. Например, рабочая книга, с которой я работаю, будет 40 МБ в новом (и, по общему признанию, более плотно упакованном) формате XLSX, станет файлом формата 360 МБ.
Что касается моих исследований, у меня есть два коммерческих пакета, которые позволяют выводить старые форматы двоичных файлов. Они есть:
Не дешево (500USD и 800USD соответственно, я думаю). но обе работают независимо от самого Excel.
Что мне будет интересно, так это модуль вывода Excel для подобных OpenOffice.org. Интересно, можно ли их портировать с Java на.Net.
Я согласен с созданием XML-таблиц, вот пример того, как это сделать для С# 3 (все просто блоги об этом в VB 9: P) http://www.aaron-powell.com/linq-to-xml-to-excel
public class GridViewExportUtil
{
public static void Export(string fileName, GridView gv)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader(
"content-disposition", string.Format("attachment; filename={0}", fileName));
HttpContext.Current.Response.ContentType = "application/ms-excel";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
// add the header row to the table
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
// render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
}
/// <summary>
/// Replace any of the contained controls with literals
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
}
else if (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
}
else if (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
}
else if (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
}
else if (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}
}
Привет, это решение заключается в том, чтобы экспортировать вид сетки в ваш файл excel, который может помочь вам
Некоторые сторонние поставщики компонентов, такие как Infragistics или Syncfusion, обеспечивают очень хорошие возможности экспорта Excel, которые не требуют установки Microsoft Excel.
Поскольку эти поставщики также предоставляют расширенные компоненты сетки пользовательского интерфейса, эти компоненты особенно удобны, если вы хотите, чтобы стиль и макет экспорта excel имитировали текущее состояние сетки в пользовательском интерфейсе вашего приложения.
Если ваш экспорт предназначен для выполнения на стороне сервера с акцентом на экспортируемые данные и без ссылки на пользовательский интерфейс, я бы воспользовался одним из бесплатных вариантов с открытым исходным кодом (например, ExcelLibrary).
Ранее я участвовал в проектах, которые пытались использовать автоматизацию на стороне сервера в пакете Microsoft Office. Исходя из этого опыта, я бы настоятельно рекомендовал против такого подхода.
Вы можете создавать красиво отформатированные файлы Excel с помощью этой библиотеки:
http://officehelper.codeplex.com/documentation
Пример ниже:
using (ExcelHelper helper = new ExcelHelper(TEMPLATE_FILE_NAME, GENERATED_FILE_NAME))
{
helper.Direction = ExcelHelper.DirectionType.TOP_TO_DOWN;
helper.CurrentSheetName = "Sheet1";
helper.CurrentPosition = new CellRef("C3");
//the template xlsx should contains the named range "header"; use the command "insert"/"name".
helper.InsertRange("header");
//the template xlsx should contains the named range "sample1";
//inside this range you should have cells with these values:
//<name> , <value> and <comment>, which will be replaced by the values from the getSample()
CellRangeTemplate sample1 = helper.CreateCellRangeTemplate("sample1", new List<string> {"name", "value", "comment"});
helper.InsertRange(sample1, getSample());
//you could use here other named ranges to insert new cells and call InsertRange as many times you want,
//it will be copied one after another;
//even you can change direction or the current cell/sheet before you insert
//typically you put all your "template ranges" (the names) on the same sheet and then you just delete it
helper.DeleteSheet("Sheet3");
}
где образец выглядит следующим образом:
private IEnumerable<List<object>> getSample()
{
var random = new Random();
for (int loop = 0; loop < 3000; loop++)
{
yield return new List<object> {"test", DateTime.Now.AddDays(random.NextDouble()*100 - 50), loop};
}
}
Я недавно использовал FlexCel.NET и нашел отличную библиотеку! Я не говорю о слишком многих программных продуктах. Не стоит указывать здесь весь объем продаж, вы можете прочитать все функции на своем веб-сайте.
Это коммерческий продукт, но вы получаете полный источник, если вы его купите. Поэтому, я полагаю, вы могли бы скомпилировать его в свою сборку, если хотите. В противном случае это всего лишь одна дополнительная сборка для xcopy - без конфигурации или установки или чего-либо подобного.
Я не думаю, что вы найдете какой-либо способ сделать это без сторонних библиотек, поскольку.NET framework, очевидно, не поддерживает его, а OLE Automation - всего лишь целый мир боли.
Здесь можно сделать это с LINQ to XML, в комплекте с образцом кода:
Быстрый импорт и экспорт данных Excel с помощью LINQ to XML
Это немного сложно, поскольку вам нужно импортировать пространства имен и т.д., но это позволяет вам избежать любых внешних зависимостей.
(Также, конечно, это VB.NET, а не С#, но вы всегда можете изолировать материал VB.NET в своем собственном проекте, чтобы использовать XML-литералы и делать все остальное на С#.)
Самый простой и быстрый способ создания файла Excel из С# - использовать инструмент производительности Open XML. Инструмент производительности Open XML поставляется с установкой Open XML SDK. Инструмент реверсирует любой файл Excel в код С#. Затем код С# можно использовать для повторного создания этого файла.
Обзор процесса:
DesiredLook.xlsx
.DesiredLook.xlsx
и нажмите кнопку Reflect Code рядом с верхней. В качестве бонуса этот метод работает для любых файлов Word и PowerPoint. Будучи разработчиком С#, вы вносите изменения в код в соответствии с вашими потребностями.
Я разработал простое приложение WPF для github, которое будет работать в Windows для этой цели. Существует класс-заполнитель под названием GeneratedClass
который вы можете вставить сгенерированный код. Если вы вернетесь к одной версии файла, она будет генерировать файл excel следующим образом:
Я написал простой код для экспорта набора данных для excel без использования объекта excel с помощью System.IO.StreamWriter.
Ниже приведен код, который будет считывать все таблицы из набора данных и записывать их в листы один за другим. Я получил помощь от этой статьи.
public static void exportToExcel(DataSet source, string fileName)
{
const string endExcelXML = "</Workbook>";
const string startExcelXML = "<xml version>\r\n<Workbook " +
"xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\r\n" +
" xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n " +
"xmlns:x=\"urn:schemas- microsoft-com:office:" +
"excel\"\r\n xmlns:ss=\"urn:schemas-microsoft-com:" +
"office:spreadsheet\">\r\n <Styles>\r\n " +
"<Style ss:ID=\"Default\" ss:Name=\"Normal\">\r\n " +
"<Alignment ss:Vertical=\"Bottom\"/>\r\n <Borders/>" +
"\r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>" +
"\r\n <Protection/>\r\n </Style>\r\n " +
"<Style ss:ID=\"BoldColumn\">\r\n <Font " +
"x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"StringLiteral\">\r\n <NumberFormat" +
" ss:Format=\"@\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"Decimal\">\r\n <NumberFormat " +
"ss:Format=\"0.0000\"/>\r\n </Style>\r\n " +
"<Style ss:ID=\"Integer\">\r\n <NumberFormat " +
"ss:Format=\"0\"/>\r\n </Style>\r\n <Style " +
"ss:ID=\"DateLiteral\">\r\n <NumberFormat " +
"ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n " +
"</Styles>\r\n ";
System.IO.StreamWriter excelDoc = null;
excelDoc = new System.IO.StreamWriter(fileName);
int sheetCount = 1;
excelDoc.Write(startExcelXML);
foreach (DataTable table in source.Tables)
{
int rowCount = 0;
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
excelDoc.Write("<Row>");
for (int x = 0; x < table.Columns.Count; x++)
{
excelDoc.Write("<Cell ss:StyleID=\"BoldColumn\"><Data ss:Type=\"String\">");
excelDoc.Write(table.Columns[x].ColumnName);
excelDoc.Write("</Data></Cell>");
}
excelDoc.Write("</Row>");
foreach (DataRow x in table.Rows)
{
rowCount++;
//if the number of rows is > 64000 create a new page to continue output
if (rowCount == 64000)
{
rowCount = 0;
sheetCount++;
excelDoc.Write("</Table>");
excelDoc.Write(" </Worksheet>");
excelDoc.Write("<Worksheet ss:Name=\"" + table.TableName + "\">");
excelDoc.Write("<Table>");
}
excelDoc.Write("<Row>"); //ID=" + rowCount + "
for (int y = 0; y < table.Columns.Count; y++)
{
System.Type rowType;
rowType = x[y].GetType();
switch (rowType.ToString())
{
case "System.String":
string XMLstring = x[y].ToString();
XMLstring = XMLstring.Trim();
XMLstring = XMLstring.Replace("&", "&");
XMLstring = XMLstring.Replace(">", ">");
XMLstring = XMLstring.Replace("<", "<");
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(XMLstring);
excelDoc.Write("</Data></Cell>");
break;
case "System.DateTime":
//Excel has a specific Date Format of YYYY-MM-DD followed by
//the letter 'T' then hh:mm:sss.lll Example 2005-01-31T24:01:21.000
//The Following Code puts the date stored in XMLDate
//to the format above
DateTime XMLDate = (DateTime)x[y];
string XMLDatetoString = ""; //Excel Converted Date
XMLDatetoString = XMLDate.Year.ToString() +
"-" +
(XMLDate.Month < 10 ? "0" +
XMLDate.Month.ToString() : XMLDate.Month.ToString()) +
"-" +
(XMLDate.Day < 10 ? "0" +
XMLDate.Day.ToString() : XMLDate.Day.ToString()) +
"T" +
(XMLDate.Hour < 10 ? "0" +
XMLDate.Hour.ToString() : XMLDate.Hour.ToString()) +
":" +
(XMLDate.Minute < 10 ? "0" +
XMLDate.Minute.ToString() : XMLDate.Minute.ToString()) +
":" +
(XMLDate.Second < 10 ? "0" +
XMLDate.Second.ToString() : XMLDate.Second.ToString()) +
".000";
excelDoc.Write("<Cell ss:StyleID=\"DateLiteral\">" +
"<Data ss:Type=\"DateTime\">");
excelDoc.Write(XMLDatetoString);
excelDoc.Write("</Data></Cell>");
break;
case "System.Boolean":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
excelDoc.Write("<Cell ss:StyleID=\"Integer\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.Decimal":
case "System.Double":
excelDoc.Write("<Cell ss:StyleID=\"Decimal\">" +
"<Data ss:Type=\"Number\">");
excelDoc.Write(x[y].ToString());
excelDoc.Write("</Data></Cell>");
break;
case "System.DBNull":
excelDoc.Write("<Cell ss:StyleID=\"StringLiteral\">" +
"<Data ss:Type=\"String\">");
excelDoc.Write("");
excelDoc.Write("</Data></Cell>");
break;
default:
throw (new Exception(rowType.ToString() + " not handled."));
}
}
excelDoc.Write("</Row>");
}
excelDoc.Write("</Table>");
excelDoc.Write(" </Worksheet>");
sheetCount++;
}
excelDoc.Write(endExcelXML);
excelDoc.Close();
}
Некоторая полезная автоматизация Excel в С#, вы можете найти по следующей ссылке.
http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm
Болтона.
Посмотрите образцы, как создавать файлы Excel.
Есть примеры в С# и VB.NET
Он управляет файлами XSL XSLX и CSV Excel.
Вы когда-нибудь пробовали sylk?
Мы использовали для создания excelsheets в классическом asp как sylk, и прямо сейчас мы ищем excelgenerater.
Преимущества для sylk заключаются в том, что вы можете отформатировать ячейки.
Найдите ExtremeML. Это довольно классная библиотека, которая позволяет вам использовать формат OpenXML для генерации файлов OpenXML.
Это также проект OpenSource.
Java с открытым исходным кодом - Apache POI. Может быть, есть способ настроить interop здесь, но я не знаю достаточно о Java, чтобы ответить на это.
Когда я исследовал эту проблему, я закончил использование сборок Interop.
http://www.codeproject.com/KB/cs/Excel_and_C_.aspx <= почему бы просто не использовать встроенные возможности окон, просто установить офис на сервере, любое приложение, которое вы установка может быть автоматизирована.
Намного проще использовать собственные методы.
Если он установлен, вы можете использовать его, это самая удивительная и используемая функция в окнах, в которую она была перезаписана COM в старые добрые времена, и это экономит вам массу времени и боли.
Или даже проще просто использовать поставки ref lib MS - http://csharp.net-informations.com/excel/csharp-create-excel.htm
Я также проголосую за GemBox.Spreadsheet.
Очень быстрый и простой в использовании, с множеством примеров на их сайте.
Принимал мои задачи отчетности на совершенно новом уровне скорости выполнения.
Один очень простой вариант, который часто упускается из виду, - создать отчет.rdlc с помощью Microsoft Reporting и экспортировать его в формат excel. Вы можете создать его в визуальной студии и сгенерировать файл, используя:
localReport.Render("EXCELOPENXML", null, ((name, ext, encoding, mimeType, willSeek) => stream = new FileStream(name, FileMode.CreateNew)), out warnings);
Вы также можете экспортировать его.doc или.pdf, используя "WORDOPENXML"
и "PDF"
соответственно, и он поддерживается на многих разных платформах, таких как ASP.NET и SSRS.
Намного легче вносить изменения в визуальный конструктор, где вы можете увидеть результаты и доверять мне, как только вы начнете группировать данные, форматировать заголовки групп, добавляя новые разделы, вы не хотите связываться с десятками узлов XML.
Вы можете просто записать его в XML, используя формат Excel XML, и назовите его расширением.XLS, и он откроется с помощью excel. Вы можете управлять всем форматированием (жирным шрифтом, шириной и т.д.) В заголовке файла XML.
В Википедии есть пример XML.
Некоторое время назад я создал DLL поверх NPOI. Это очень простое использование:
IList<DummyPerson> dummyPeople = new List<DummyPerson>();
//Add data to dummyPeople...
IExportEngine engine = new ExcelExportEngine();
engine.AddData(dummyPeople);
MemoryStream memory = engine.Export();
Вы можете прочитать об этом на здесь.
Кстати, это 100% открытый источник. Не стесняйтесь использовать, редактировать и делиться;)
Если вы делаете таблицу данных или datagridview из кода, вы можете сохранить все данные с помощью этого простого метода. Этот метод не рекомендуется, но его работа на 100%, даже если вы не устанавливаете MS Excel на свой компьютер.
try
{
SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Excel Documents (*.xls)|*.xls";
saveFileDialog1.FileName = "Employee Details.xls";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string fname = saveFileDialog1.FileName;
StreamWriter wr = new StreamWriter(fname);
for (int i = 0; i <DataTable.Columns.Count; i++)
{
wr.Write(DataTable.Columns[i].ToString().ToUpper() + "\t");
}
wr.WriteLine();
//write rows to excel file
for (int i = 0; i < (DataTable.Rows.Count); i++)
{
for (int j = 0; j < DataTable.Columns.Count; j++)
{
if (DataTable.Rows[i][j] != null)
{
wr.Write(Convert.ToString(getallData.Rows[i][j]) + "\t");
}
else
{
wr.Write("\t");
}
}
//go to next line
wr.WriteLine();
}
//close file
wr.Close();
}
}
catch (Exception)
{
MessageBox.Show("Error Create Excel Sheet!");
}
проверить это не нужно для сторонних библиотек, вы можете просто экспортировать данные в файл Excel, используя это
var dt = "your code for getting data into datatable";
Response.ClearContent();
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", DateTime.Now.ToString("yyyy-MM-dd")));
Response.ContentType = "application/vnd.ms-excel";
string tab = "";
foreach (DataColumn dataColumn in dt.Columns)
{
Response.Write(tab + dataColumn.ColumnName);
tab = "\t";
}
Response.Write("\n");
int i;
foreach (DataRow dataRow in dt.Rows)
{
tab = "";
for (i = 0; i < dt.Columns.Count; i++)
{
Response.Write(tab + dataRow[i].ToString());
tab = "\t";
}
Response.Write("\n");
}
Response.End();
Чтобы сохранить xls в формате xlsx, нам просто нужно вызвать метод SaveAs
из библиотеки Microsoft.Office.Interop.Excel
. Этот метод будет содержать около 16 параметров, а один из них также будет форматом файла.
Документ Microsoft: здесь Аргументы метода SaveAs
Объект, который нам нужно передать, подобен
wb.SaveAs(filename, 51, System.Reflection.Missing.Value,
System.Reflection.Missing.Value, false, false, 1,1, true,
System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value)
Здесь 51 - значение перечисления для XLSX
Для SaveAs в разных форматах файлов вы можете обратиться к xlFileFormat
Я использую следующий код для создания файла excel 2007, который создает файл и записывает его в этот файл, но когда я открываю файл, но он дает мне ошибку, exel не может открыть файл bcz файл может быть coruupted или расширение файла несовместимо. но если я использовал .xls для файла, он работает штрафы
for (int i = 0; i < TotalFile; i++)
{
Contact.Clear();
if (innerloop == SplitSize)
{
for (int j = 0; j < SplitSize; j++)
{
string strContact = DSt.Tables[0].Rows[i * SplitSize + j][0].ToString();
Contact.Add(strContact);
}
string strExcel = strFileName + "_" + i.ToString() + ".xlsx";
File.WriteAllLines(strExcel, Contact.ToArray());
}
}
также ссылается на ссылку
http://dotnet-magic.blogspot.in/2011/10/createformat-excel-file-from-cnet.html
Contact
, и вы не сказали нам, что это такое. Если это работает для xls, то, скорее всего, вы пишете HTML, который не является настоящим файлом Excel. А ваша ссылка использует взаимодействие, которое, как упоминалось выше, не должно использоваться на стороне сервера и может медленно заполнять большие таблицы.
xls
илиxlsx
). Не обязательно, чтобы на вашем компьютере была программа, которая может читать ее (скажем, двоичную).