导出数据表到Excel文件
我有一个DataTable 30 +列和6500 + rows.I需要转储整个DataTable值到一个Excel文件。任何人都可以请帮助C#代码。我需要每个列的值在一个单元格。准确地说,我需要在Excel文件中的DataTable的确切外观副本。请帮助。
谢谢,Vix
使用这个代码…
dt = city.GetAllCity();//your datatable string attachment = "attachment; filename=city.xls"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/vnd.ms-excel"; string tab = ""; foreach (DataColumn dc in dt.Columns) { Response.Write(tab + dc.ColumnName); tab = "\t"; } Response.Write("\n"); int i; foreach (DataRow dr in dt.Rows) { tab = ""; for (i = 0; i < dt.Columns.Count; i++) { Response.Write(tab + dr[i].ToString()); tab = "\t"; } Response.Write("\n"); } Response.End();
这段代码可以更快地实现:
// Example data DataTable table = new DataTable(); table.Columns.AddRange(new[]{ new DataColumn("Key"), new DataColumn("Value") }); foreach (string name in Request.ServerVariables) table.Rows.Add(name, Request.ServerVariables[name]); // This actually makes your HTML output to be downloaded as .xls file Response.Clear(); Response.ClearContent(); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=ExcelFile.xls"); // Create a dynamic control, populate and render it GridView excel = new GridView(); excel.DataSource = table; excel.DataBind(); excel.RenderControl(new HtmlTextWriter(Response.Output)); Response.Flush(); Response.End();
下面的链接用于导出datatable到C#代码中的excel。
http://royalarun.blogspot.in/2012/01/export-datatable-to-excel-in-c-windows.html
using System; using System.Data; using System.IO; using System.Windows.Forms; namespace ExportExcel { public partial class ExportDatatabletoExcel : Form { public ExportDatatabletoExcel() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); //Add Datacolumn DataColumn workCol = dt.Columns.Add("FirstName", typeof(String)); dt.Columns.Add("LastName", typeof(String)); dt.Columns.Add("Blog", typeof(String)); dt.Columns.Add("City", typeof(String)); dt.Columns.Add("Country", typeof(String)); //Add in the datarow DataRow newRow = dt.NewRow(); newRow["firstname"] = "Arun"; newRow["lastname"] = "Prakash"; newRow["Blog"] = "http://royalarun.blogspot.com/"; newRow["city"] = "Coimbatore"; newRow["country"] = "India"; dt.Rows.Add(newRow); //open file StreamWriter wr = new StreamWriter(@"D:\\Book1.xls"); try { for (int i = 0; i < dt.Columns.Count; i++) { wr.Write(dt.Columns[i].ToString().ToUpper() + "\t"); } wr.WriteLine(); //write rows to excel file for (int i = 0; i < (dt.Rows.Count); i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Rows[i][j] != null) { wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t"); } else { wr.Write("\t"); } } //go to next line wr.WriteLine(); } //close file wr.Close(); } catch (Exception ex) { throw ex; } } } }
本post中的最高级答案是CSV文件。 这不是真正的Excel文件。 因此,当您打开文件时,您会收到警告。
我在网上find的最佳解决scheme是使用CloseXML http://closedxml.codeplex.com/您还需要打开XML。;
dt = city.GetAllCity();//your datatable using (XLWorkbook wb = new XLWorkbook()) { wb.Worksheets.Add(dt); Response.Clear(); Response.Buffer = true; Response.Charset = ""; Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", "attachment;filename=GridView.xlsx"); using (MemoryStream MyMemoryStream = new MemoryStream()) { wb.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(Response.OutputStream); Response.Flush(); Response.End(); } }
信用: http : //www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export-to-Excel-The-file-you-are-trying-to-open-is-in-a-different-format-超过规定的,由这文件extension.aspx
我在页面中使用这个
public void DTToExcel(DataTable dt) { // dosya isimleri ileride aynı anda birden fazla kullanıcı aynı dosya üzerinde işlem yapmak ister düşüncesiyle guid yapıldı. string FileName = Guid.NewGuid().ToString(); FileInfo f = new FileInfo(Server.MapPath("Downloads") + string.Format("\\{0}.xlsx", FileName)); if (f.Exists) f.Delete(); // delete the file if it already exist. HttpResponse response = HttpContext.Current.Response; response.Clear(); response.ClearHeaders(); response.ClearContent(); response.Charset = Encoding.UTF8.WebName; response.AddHeader("content-disposition", "attachment; filename=" + FileName + ".xls"); response.AddHeader("Content-Type", "application/Excel"); response.ContentType = "application/vnd.xlsx"; //response.AddHeader("Content-Length", file.Length.ToString()); // create a string writer using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) //datatable'a aldığımız sorguyu bir datagrid'e atayıp html'e çevir. { // instantiate a datagrid DataGrid dg = new DataGrid(); dg.DataSource = dt; dg.DataBind(); dg.RenderControl(htw); response.Write(sw.ToString()); dg.Dispose(); dt.Dispose(); response.End(); } } }
var lines = new List<string>(); string[] columnNames = dt.Columns.Cast<DataColumn>(). Select(column => column.ColumnName). ToArray(); var header = string.Join(",", columnNames); lines.Add(header); var valueLines = dt.AsEnumerable() .Select(row => string.Join(",", row.ItemArray)); lines.AddRange(valueLines); File.WriteAllLines("excel.csv", lines);
这里dt是指你的DataTable通道作为参数
虽然不是.NET实现,但您可能会发现,根据您的受众,插件TableTools
可能会非常有效。 它依赖于闪存,这对大多数需要实际深入工作并且想要logging表格信息的情况应该不成问题。
最新版本似乎支持复制到剪贴板,CSV,“.XLS”(实际上只是一个制表符分隔的文件名为.xls),一个PDF,或创build一个打印友好的页面版本显示所有行,其余的您的网页内容隐藏。
我在这里find了DataTables网站的扩展: http : //datatables.net/extras/tabletools/
下载可在插件(extras)页面中find: http : //datatables.net/extras/
它应该是作为DataTables的一部分下载的(因此,“DataTables包中包含的附件”一词),但我没有find它在我一直在使用的下载。 似乎奇妙地工作!
在Excel中打开时,大多数答案实际上是生成CSV,我并不总是有很好的经验。
一种做法是使用ACE OLEDB Provider (另请参阅Excel的连接string )。 当然,你必须安装和注册提供商。 如果你已经安装了Excel,你确实有这个需求,但这是部署时必须考虑的事情(例如在Web服务器上)。
在下面的帮助程序类代码中,您必须调用类似ExportHelper.CreateXlsFromDataTable(dataset.Tables[0], @"C:\tmp\export.xls");
public class ExportHelper { private const string ExcelOleDbConnectionStringTemplate = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES\";"; /// <summary> /// Creates the Excel file from items in DataTable and writes them to specified output file. /// </summary> public static void CreateXlsFromDataTable(DataTable dataTable, string fullFilePath) { string createTableWithHeaderScript = GenerateCreateTableCommand(dataTable); using (var conn = new OleDbConnection(String.Format(ExcelOleDbConnectionStringTemplate, fullFilePath))) { if (conn.State != ConnectionState.Open) { conn.Open(); } OleDbCommand cmd = new OleDbCommand(createTableWithHeaderScript, conn); cmd.ExecuteNonQuery(); foreach (DataRow dataExportRow in dataTable.Rows) { AddNewRow(conn, dataExportRow); } } } private static void AddNewRow(OleDbConnection conn, DataRow dataRow) { string insertCmd = GenerateInsertRowCommand(dataRow); using (OleDbCommand cmd = new OleDbCommand(insertCmd, conn)) { AddParametersWithValue(cmd, dataRow); cmd.ExecuteNonQuery(); } } /// <summary> /// Generates the insert row command. /// </summary> private static string GenerateInsertRowCommand(DataRow dataRow) { var stringBuilder = new StringBuilder(); var columns = dataRow.Table.Columns.Cast<DataColumn>().ToList(); var columnNamesCommaSeparated = string.Join(",", columns.Select(x => x.Caption)); var questionmarkCommaSeparated = string.Join(",", columns.Select(x => "?")); stringBuilder.AppendFormat("INSERT INTO [{0}] (", dataRow.Table.TableName); stringBuilder.Append(columnNamesCommaSeparated); stringBuilder.Append(") VALUES("); stringBuilder.Append(questionmarkCommaSeparated); stringBuilder.Append(")"); return stringBuilder.ToString(); } /// <summary> /// Adds the parameters with value. /// </summary> private static void AddParametersWithValue(OleDbCommand cmd, DataRow dataRow) { var paramNumber = 1; for (int i = 0; i <= dataRow.Table.Columns.Count - 1; i++) { if (!ReferenceEquals(dataRow.Table.Columns[i].DataType, typeof(int)) && !ReferenceEquals(dataRow.Table.Columns[i].DataType, typeof(decimal))) { cmd.Parameters.AddWithValue("@p" + paramNumber, dataRow[i].ToString().Replace("'", "''")); } else { object value = GetParameterValue(dataRow[i]); OleDbParameter parameter = cmd.Parameters.AddWithValue("@p" + paramNumber, value); if (value is decimal) { parameter.OleDbType = OleDbType.Currency; } } paramNumber = paramNumber + 1; } } /// <summary> /// Gets the formatted value for the OleDbParameter. /// </summary> private static object GetParameterValue(object value) { if (value is string) { return value.ToString().Replace("'", "''"); } return value; } private static string GenerateCreateTableCommand(DataTable tableDefination) { StringBuilder stringBuilder = new StringBuilder(); bool firstcol = true; stringBuilder.AppendFormat("CREATE TABLE [{0}] (", tableDefination.TableName); foreach (DataColumn tableColumn in tableDefination.Columns) { if (!firstcol) { stringBuilder.Append(", "); } firstcol = false; string columnDataType = "CHAR(255)"; switch (tableColumn.DataType.Name) { case "String": columnDataType = "CHAR(255)"; break; case "Int32": columnDataType = "INTEGER"; break; case "Decimal": // Use currency instead of decimal because of bug described at // http://social.msdn.microsoft.com/Forums/vstudio/en-US/5d6248a5-ef00-4f46-be9d-853207656bcc/localization-trouble-with-oledbparameter-and-decimal?forum=csharpgeneral columnDataType = "CURRENCY"; break; } stringBuilder.AppendFormat("{0} {1}", tableColumn.ColumnName, columnDataType); } stringBuilder.Append(")"); return stringBuilder.ToString(); } }
Excel导出的工作代码
try { DataTable dt = DS.Tables[0]; string attachment = "attachment; filename=log.xls"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/vnd.ms-excel"; string tab = ""; foreach (DataColumn dc in dt.Columns) { Response.Write(tab + dc.ColumnName); tab = "\t"; } Response.Write("\n"); int i; foreach (DataRow dr in dt.Rows) { tab = ""; for (i = 0; i < dt.Columns.Count; i++) { Response.Write(tab + dr[i].ToString()); tab = "\t"; } Response.Write("\n"); } Response.End(); } catch (Exception Ex) { }
如果你导出数据表格,以格式化标题文本优秀尝试像这样。
public void ExportFullDetails() { Int16 id = Convert.ToInt16(Session["id"]); DataTable registeredpeople = new DataTable(); registeredpeople = this.dataAccess.ExportDetails(eventid); string attachment = "attachment; filename=Details.xls"; Response.ClearContent(); Response.AddHeader("content-disposition", attachment); Response.ContentType = "application/vnd.ms-excel"; string tab = ""; registeredpeople.Columns["Reg_id"].ColumnName = "Reg. ID"; registeredpeople.Columns["Name"].ColumnName = "Name"; registeredpeople.Columns["Reg_country"].ColumnName = "Country"; registeredpeople.Columns["Reg_city"].ColumnName = "City"; registeredpeople.Columns["Reg_email"].ColumnName = "Email"; registeredpeople.Columns["Reg_business_phone"].ColumnName = "Business Phone"; registeredpeople.Columns["Reg_mobile"].ColumnName = "Mobile"; registeredpeople.Columns["PositionRole"].ColumnName = "Position"; registeredpeople.Columns["Reg_work_type"].ColumnName = "Work Type"; foreach (DataColumn dc in registeredpeople.Columns) { Response.Write(tab + dc.ColumnName); tab = "\t"; } Response.Write("\n"); int i; foreach (DataRow dr in registeredpeople.Rows) { tab = ""; for (i = 0; i < registeredpeople.Columns.Count; i++) { Response.Write(tab + dr[i].ToString()); tab = "\t"; } Response.Write("\n"); } Response.End(); }
我用下面的代码完成了DataTable到Excel的转换。 希望这是非常简单的,不需要更改只是复制和有害生物代码replace你的variables与你的variables,它会正常工作。
首先在您的解决scheme文档中创build一个文件夹,然后创build一个Excel文件MyTemplate.xlsx 。 您可以根据您的要求更改这些名称。 但请记住,您必须更改代码中的名称。
请find下面的代码…
protected void GetExcel_Click(object sender, EventArgs e) { ManageTicketBS objManageTicket = new ManageTicketBS(); DataTable DT = objManageTicket.GetAlldataByDate(); //this function will bring the data in DataTable format, you can use your function instate of that. string DownloadFileName; string FolderPath; string FileName = "MyTemplate.xlsx"; DownloadFileName = Path.GetFileNameWithoutExtension(FileName) + new Random().Next(10000, 99999) + Path.GetExtension(FileName); FolderPath = ".\\" + DownloadFileName; GetParents(Server.MapPath("~/Document/" + FileName), Server.MapPath("~/Document/" + DownloadFileName), DT); string path = Server.MapPath("~/Document/" + FolderPath); FileInfo file = new FileInfo(path); if (file.Exists) { try { HttpResponse response = HttpContext.Current.Response; response.Clear(); response.ClearContent(); response.ClearHeaders(); response.Buffer = true; response.ContentType = MimeType(Path.GetExtension(FolderPath)); response.AddHeader("Content-Disposition", "attachment;filename=" + DownloadFileName); byte[] data = File.ReadAllBytes(path); response.BinaryWrite(data); HttpContext.Current.ApplicationInstance.CompleteRequest(); response.End(); } catch (Exception ex) { ex.ToString(); } finally { DeleteOrganisationtoSupplierTemplate(path); } } } public string GetParents(string FilePath, string TempFilePath, DataTable DTTBL) { File.Copy(Path.Combine(FilePath), Path.Combine(TempFilePath), true); FileInfo file = new FileInfo(TempFilePath); try { DatatableToExcel(DTTBL, TempFilePath, 0); return TempFilePath; } catch (Exception ex) { return ""; } } public static string MimeType(string Extension) { string mime = "application/octetstream"; if (string.IsNullOrEmpty(Extension)) return mime; string ext = Extension.ToLower(); Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); if (rk != null && rk.GetValue("Content Type") != null) mime = rk.GetValue("Content Type").ToString(); return mime; } static bool DeleteOrganisationtoSupplierTemplate(string filePath) { try { File.Delete(filePath); return true; } catch (IOException) { return false; } } public void DatatableToExcel(DataTable dtable, string pFilePath, int excelSheetIndex=1) { try { if (dtable != null && dtable.Rows.Count > 0) { IWorkbook workbook = null; ISheet worksheet = null; using (FileStream stream = new FileStream(pFilePath, FileMode.Open, FileAccess.ReadWrite)) { workbook = WorkbookFactory.Create(stream); worksheet = workbook.GetSheetAt(excelSheetIndex); int iRow = 1; foreach (DataRow row in dtable.Rows) { IRow file = worksheet.CreateRow(iRow); int iCol = 0; foreach (DataColumn column in dtable.Columns) { ICell cell = null; object cellValue = row[iCol]; switch (column.DataType.ToString()) { case "System.Boolean": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.Boolean); if (Convert.ToBoolean(cellValue)) { cell.SetCellFormula("TRUE()"); } else { cell.SetCellFormula("FALSE()"); } //cell.CellStyle = _boolCellStyle; } break; case "System.String": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.String); cell.SetCellValue(Convert.ToString(cellValue)); } break; case "System.Int32": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.Numeric); cell.SetCellValue(Convert.ToInt32(cellValue)); //cell.CellStyle = _intCellStyle; } break; case "System.Int64": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.Numeric); cell.SetCellValue(Convert.ToInt64(cellValue)); //cell.CellStyle = _intCellStyle; } break; case "System.Decimal": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.Numeric); cell.SetCellValue(Convert.ToDouble(cellValue)); //cell.CellStyle = _doubleCellStyle; } break; case "System.Double": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.Numeric); cell.SetCellValue(Convert.ToDouble(cellValue)); //cell.CellStyle = _doubleCellStyle; } break; case "System.DateTime": if (cellValue != DBNull.Value) { cell = file.CreateCell(iCol, CellType.String); DateTime dateTime = Convert.ToDateTime(cellValue); cell.SetCellValue(dateTime.ToString("dd/MM/yyyy")); DateTime cDate = Convert.ToDateTime(cellValue); if (cDate != null && cDate.Hour > 0) { //cell.CellStyle = _dateTimeCellStyle; } else { // cell.CellStyle = _dateCellStyle; } } break; default: break; } iCol++; } iRow++; } using (var WritetoExcelfile = new FileStream(pFilePath, FileMode.Create, FileAccess.ReadWrite)) { workbook.Write(WritetoExcelfile); WritetoExcelfile.Close(); //workbook.Write(stream); stream.Close(); } } } } catch (Exception ex) { throw ex; } }
这段代码你只需要在你的脚本中复制&pest,并添加如下所示的名字空间 ,同样改变excel文件的名字,如前所述。
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.Util;
请尝试这个,这将导出您的数据表数据更快地出色。
注意:范围“FW”,我硬编码是因为我有179列。
public void UpdateExcelApplication(SqlDataTable dataTable) { var objects = new string[dataTable.Rows.Count, dataTable.Columns.Count]; var rowIndex = 0; foreach (DataRow row in dataTable.Rows) { var colIndex = 0; foreach (DataColumn column in dataTable.Columns) { objects[rowIndex, colIndex++] = Convert.ToString(row[column]); } rowIndex++; } var range = this.workSheet.Range[$"A3:FW{dataTable.Rows.Count + 2}"]; range.Value = objects; this.workSheet.Columns.AutoFit(); this.workSheet.Rows.AutoFit(); }
试试这个将数据导出到Excel文件中,就像在DataTable中一样,也可以自定义。
dtDataTable1 = ds.Tables[0]; try { Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application(); Workbook xlWorkBook = ExcelApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); for (int i = 1; i > 0; i--) { Sheets xlSheets = null; Worksheet xlWorksheet = null; //Create Excel sheet xlSheets = ExcelApp.Sheets; xlWorksheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing); xlWorksheet.Name = "MY FIRST EXCEL FILE"; for (int j = 1; j < dtDataTable1.Columns.Count + 1; j++) { ExcelApp.Cells[i, j] = dtDataTable1.Columns[j - 1].ColumnName; ExcelApp.Cells[1, j].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Green); ExcelApp.Cells[i, j].Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.WhiteSmoke); } // for the data of the excel for (int k = 0; k < dtDataTable1.Rows.Count; k++) { for (int l = 0; l < dtDataTable1.Columns.Count; l++) { ExcelApp.Cells[k + 2, l + 1] = dtDataTable1.Rows[k].ItemArray[l].ToString(); } } ExcelApp.Columns.AutoFit(); } ((Worksheet)ExcelApp.ActiveWorkbook.Sheets[ExcelApp.ActiveWorkbook.Sheets.Count]).Delete(); ExcelApp.Visible = true; } catch (Exception ex) { MessageBox.Show(ex.Message); }