У меня есть DataTable
Мне нужно поместить в формат Excel 2007 и сохранить его как файл excel (.xlsx) 2007.
Может ли кто-нибудь помочь мне достичь этого?
У меня есть DataTable
Мне нужно поместить в формат Excel 2007 и сохранить его как файл excel (.xlsx) 2007.
Может ли кто-нибудь помочь мне достичь этого?
Вы можете использовать поставщика данных OLEDB и просто обрабатывать Excel как другой источник данных ADO.NET, чтобы перебирать строки DataTable и вставлять их в электронную таблицу Excel. Вот статья Microsoft KB, в которой вы найдете много деталей.
http://support.microsoft.com/kb/316934/en-us
Самое главное иметь в виду, что вы можете создавать книги и листы в книге, и вы можете ссылаться на существующие листы, добавляя "$" в конце имени. Если вы опустите "$" в конце имени листа, поставщик OLEDB предположит, что это новый лист и попытается его создать.
Знак доллара после имя рабочего листа является признаком того, что таблица существует. Если вы создаете новую таблицу, как описано в Создание новых книг и таблиц раздел этой статьи, не используйте знак доллара.
Вы можете создать и электронную таблицу в формате 2003 (.xls) или 2007 (xlsx) и указать в строке соединения - указать файл, который вы собираетесь писать, и просто указать расширение. Убедитесь, что вы используете правильную версию поставщика OLEDB.
Если вы хотите создать версию 2003 (.xls), вы используете эту строку подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES
Если вы хотите создать версию 2007 (.xlsx), вы используете эту строку подключения:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES
Возможно, вам придется загрузить поставщик ACE из Microsoft для создания файлов XLSX. Вы можете найти здесь здесь.
Я обычно использую поставщика XLS, поэтому я не работал с провайдером XLSX столько же.
Надеюсь, это поможет. Дайте мне знать, если у вас есть другие вопросы.
Я написал следующий код для компании некоторое время назад. Он берет Enumerable любого типа класса и экспортирует все его свойства (get) в Excel, а также открывает Excel. Вы должны иметь возможность сделать что-то подобное для DataTable. Помните, что вам нужно добавить ссылку на Microsoft.Office.Interop.Excel
public static void ExportToExcel<T>(IEnumerable<T> exportData)
{
Excel.ApplicationClass excel = new Excel.ApplicationClass();
Excel.Workbook workbook = excel.Application.Workbooks.Add(true);
PropertyInfo[] pInfos = typeof(T).GetProperties();
if (pInfos != null && pInfos.Count() > 0)
{
int iCol = 0;
int iRow = 0;
foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
{
// Add column headings...
iCol++;
excel.Cells[1, iCol] = eachPInfo.Name;
}
foreach (T item in exportData)
{
iRow++;
// add each row cell data...
iCol = 0;
foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true))
{
iCol++;
excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null);
}
}
// Global missing reference for objects we are not defining...
object missing = System.Reflection.Missing.Value;
// If wanting to Save the workbook...
string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm";
workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
// If wanting to make Excel visible and activate the worksheet...
excel.Visible = true;
Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet;
excel.Rows.EntireRow.AutoFit();
excel.Columns.EntireColumn.AutoFit();
((Excel._Worksheet)worksheet).Activate();
}
}
У меня есть DataTable, который мне нужно вставить в формат Excel 2007 и сохранить его как файл excel (.xlsx) 2007.
Может ли кто-нибудь помочь мне достичь этого?
Вам просто нужно добавить мой бесплатный класс С# в ваш проект и одну строку кода.
Полная информация (с бесплатным загружаемым исходным кодом и примерным проектом) здесь:
База знаний Mikes - Экспорт в Excel
Моя библиотека использует бесплатные библиотеки Microsoft OpenXML (также предусмотренные в моих загрузках) для записи файла, поэтому вам не нужно использовать суперкомпьютерные библиотеки VSTO или установить Excel на ваш сервер.
Кроме того, он создает реальный .xlsx файл, а не некоторые другие методы, которые записывают поток данных в текстовый файл, разделенный запятыми, но назовите его как .xls файл.
Кстати, у меня было много трудностей с написанием файлов Excel с помощью OLEDB, не в последнюю очередь потому, что я запускал 64-разрядную версию Windows 7 с Office 2007 (32-разрядной), а поставщик Microsoft ACE должен быть 64-разрядная версия... но вы не можете установить это, если у вас установлена 32-разрядная версия Office.
Итак, вам нужно удалить Office, установить драйвер ACE, а затем снова установить Office.
Но даже тогда я отказался от использования OLEDB.. он просто не был достаточно стабильным.
Нашел это в каком-то старом кодексе, который мне понравился 5 лет назад, который должен работать...
public static void DataTableToExcel(DataTable tbl)
{
HttpContext context = HttpContext.Current;
context.Response.Clear();
foreach (DataColumn c in tbl.Columns)
{
context.Response.Write(c.ColumnName + ";");
}
context.Response.Write(Environment.NewLine);
foreach (DataRow r in tbl.Rows)
{
for (int i = 0; i < tbl.Columns.Count; i++)
{
context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";");
}
context.Response.Write(Environment.NewLine);
}
context.Response.ContentType = "text/csv";
context.Response.AppendHeader("Content-Disposition",
"attachment; filename=export.csv");
context.Response.End();
}
Это выведет из ASP.NET ответ с файлом CSV, который может открыть Excel 2007. Если вы хотите, вы можете изменить расширение, чтобы имитировать excel, и оно должно работать только путем замены следующих строк:
context.Response.ContentType = "application/vnd.ms-excel";
context.Response.AppendHeader("Content-Disposition",
"attachment; filename=export.xlsx");
CSV - это самый простой способ, если вам не нужно ничего делать сложным. Если вам действительно нужен файл Excel 2007 в собственном формате, вам нужно будет использовать библиотеку Office для ее создания или преобразования из CSV, а затем выполнить его/сохранить.
Эта ссылка также может быть полезна:
Как избежать окна подсказки Excel при экспорте данных в Excel 2007
вам нужно будет сделать много interop, вот учебник, надеюсь, что это поможет. текст ссылки
Видел, что кто-то еще разместил опцию "сохранить в csv". Хотя это не похоже на то, что искали OP, вот моя версия, которая включает заголовки таблиц.
public static String ToCsv(DataTable dt, bool addHeaders)
{
var sb = new StringBuilder();
//Add Header Header
if (addHeaders)
{
for (var x = 0; x < dt.Columns.Count; x++)
{
if (x != 0) sb.Append(",");
sb.Append(dt.Columns[x].ColumnName);
}
sb.AppendLine();
}
//Add Rows
foreach (DataRow row in dt.Rows)
{
for (var x = 0; x < dt.Columns.Count; x++)
{
if (x != 0) sb.Append(",");
sb.Append(row[dt.Columns[x]]);
}
sb.AppendLine();
}
return sb.ToString();
}