Я имею 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.
Надеюсь, это поможет. Дайте мне знать, если у вас есть другие вопросы.
вам придется делать много interop, вот учебник, надеюсь, он поможет. link text
Нашел это в старом коде, который я делал лет 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
Некоторое время назад я написал следующий код для компании. Он принимает 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's 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();
}
}