2010-07-19 10 views

Trả lời

8

Bạn có thể sử dụng nhà cung cấp dữ liệu OLEDB và chỉ coi Excel là nguồn dữ liệu ADO.NET khác để lặp qua các hàng DataTable và chèn chúng vào bảng tính Excel. Đây là một bài viết của Microsoft KB hướng dẫn bạn qua rất nhiều chi tiết.

http://support.microsoft.com/kb/316934/en-us

Điều lớn cần lưu ý là bạn có thể tạo workbook và tấm trong bảng tính, và bạn có thể tham khảo tờ hiện có bằng cách thêm một '$' ở cuối của tên. Nếu bạn bỏ qua '$' ở cuối tên trang tính, nhà cung cấp OLEDB sẽ giả định rằng đó là một trang tính mới và sẽ cố gắng tạo nó.

Ký hiệu đô la theo sau tên trang tính là dấu hiệu cho thấy bảng hiện có là . Nếu bạn đang tạo một bảng mới, như được thảo luận trong phần Tạo Sổ làm việc và Bàn mới của bài viết này, không sử dụng dấu hiệu đồng đô la .

Bạn có thể tạo và bảng tính theo định dạng 2003 (xls) hoặc 2007 (xlsx) và được xác định trên chuỗi kết nối của bạn - bạn chỉ định tệp bạn sẽ ghi vào và chỉ định sự mở rộng. Đảm bảo bạn sử dụng đúng phiên bản nhà cung cấp OLEDB.

Nếu bạn muốn tạo ra một (.xls) phiên bản 2003, bạn sử dụng chuỗi kết nối này:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES 

Nếu bạn muốn tạo ra một (.xlsx) phiên bản 2007, bạn sử dụng chuỗi kết nối này:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES 

Bạn có thể phải tải xuống nhà cung cấp ACE từ Microsoft để tạo tệp XLSX. Bạn có thể tìm thấy nó here.

Tôi thường sử dụng nhà cung cấp XLS, vì vậy tôi chưa làm việc với nhà cung cấp XLSX nhiều.

Hy vọng điều này sẽ hữu ích. Hãy cho tôi biết nếu bạn có câu hỏi khác.

+0

Tôi đã làm chính xác mọi thứ. Nhưng khi im tạo các tập tin XLSX, nó được tạo ra, nhưng khi tôi cố gắng mở nó, nó cho thấy tập tin bị hỏng. tôi nên làm gì. Tôi đã làm theo các bước tương tự trong liên kết Trên MS mà bạn đã cung cấp – smilu

+0

Lưu ý rằng nó sẽ sử dụng các giá trị 5 đến 8 đầu tiên trong cột để "đoán" loại dữ liệu của nó. Sau đó, nó sẽ đặt bất kỳ giá trị không phù hợp nào thành NULL. I E. nếu bạn có một cột có các giá trị sau đây, ví dụ: số điện thoại: 004412345677, 00443777373, [... nhiều số khác ở đây ...], +44 (22) 3883774747, [.... một số số điện thoại khác có dấu cộng và dấu ngoặc vuông ...], v.v. - tất cả những số điện thoại không phải là số này rất có thể sẽ được đặt là NULL trong tệp kết quả của bạn.Một cách để sửa lỗi thiết kế này đòi hỏi phải tinh chỉnh registry. Tùy chọn khác có thể đang sử dụng OpenXML SDK 2.5 - tải xuống miễn phí từ Microsoft. – demp

1

Các mặt hàng này ở một số mã cũ tôi đã làm như 5 năm trước đây nên hoạt động ...

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(); 
} 

Sản lượng này sẽ từ ASP.NET một phản ứng với một tập tin CSV mà Excel 2007 có thể mở. Nếu bạn muốn, bạn có thể thay đổi phần mở rộng để bắt chước excel và nó sẽ chỉ làm việc bằng cách thay thế các dòng sau:

context.Response.ContentType = "application/vnd.ms-excel"; 
    context.Response.AppendHeader("Content-Disposition", 
     "attachment; filename=export.xlsx"); 

Một CSV là cách dễ nhất nếu bạn không cần phải làm bất cứ điều gì phức tạp. Nếu bạn yêu cầu nó thực sự là một tập tin Excel 2007 ở định dạng gốc, bạn sẽ cần phải sử dụng một thư viện Office để xây dựng nó hoặc chuyển đổi nó từ CSV và sau đó phục vụ/lưu nó.

Liên kết này cũng có thể có ích:

How to avoid the Excel prompt window when exporting data to Excel 2007

+0

@hey, tôi tryn làm điều tương tự ... nhưng không thành công .... u có thể trả lời bài ma .... nhờ Câu hỏi của tôi (http://stackoverflow.com/questions/13737495/format-error-while-exporting-to-excel-from-gridview-in-asp- net) – Kulkarni

0

bạn sẽ phải làm rất nhiều interop, đây là một hướng dẫn, hy vọng nó sẽ giúp. link text

3

Tôi đã viết mã sau đây cho công ty một thời gian. Phải mất Enumerable của bất kỳ loại lớp học và xuất khẩu tất cả các thuộc tính (get) của nó để Excel và cũng mở Excel. Bạn sẽ có thể làm một cái gì đó tương tự cho một DataTable. Hãy nhớ rằng bạn cần phải thêm tham chiếu đến 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(); 
     } 
    } 
2

Tôi có một DataTable tôi cần phải đưa vào định dạng Excel 2007 và lưu nó như một file excel (.xlsx) 2007.

Có ai có thể giúp tôi đạt được điều này không?

Bạn chỉ cần thêm lớp C# miễn phí vào dự án của mình và một dòng mã.

Chi tiết đầy đủ (với mã miễn phí tải về nguồn, và một dự án chẳng hạn) ở đây:

Mikes Knowledge Base - Export to Excel

Thư viện của tôi sử dụng miễn phí Microsoft OpenXML thư viện (cũng được cung cấp trong tải của tôi) để ghi các file , do đó bạn không phải sử dụng các thư viện VSTO nặng hoặc có cài đặt Excel trên máy chủ của bạn.

Ngoài ra, tệp này tạo tệp thực .xlsx, thay vì một số phương pháp khác ghi luồng dữ liệu vào tệp văn bản được phân cách bằng dấu phẩy, nhưng đặt tên tệp dưới dạng tệp .xls.

Nhân tiện, tôi có tải các khó khăn khi ghi vào tệp Excel bằng OLEDB, ít nhất là vì tôi đang chạy Windows 7 64 bit, với Office 2007 (32 bit) và nhà cung cấp Microsoft ACE phải là ấn bản 64 bit ... nhưng bạn không thể cài đặt phiên bản này, nếu bạn đã cài đặt phiên bản 32 bit của Office.

Vì vậy, bạn phải gỡ cài đặt Office, cài đặt trình điều khiển ACE và sau đó cài đặt lại Office.
Nhưng ngay cả sau đó, tôi đã từ bỏ sử dụng OLEDB .. nó chỉ không đủ ổn định.

0

Thấy rằng người khác đã đăng tùy chọn "lưu vào csv". Mặc dù điều đó dường như không phải là câu trả lời mà OP đang tìm kiếm, đây là phiên bản của tôi bao gồm các tiêu đề của bảng

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(); 
    }