2011-02-25 139 views
0

嗨 我正在使用ASP.NET應用程序並在Excel頁面中以.csv擴展名生成報告。不過,我想用.xlsx etension生成它。 我目前正在使用的代碼如下: 保護小組btnSubmit_Click(BYVAL發件人爲對象,BYVALË作爲EventArgs的)把手btnSubmit.Click從.csv文件轉換爲.xlsx excel文件

Dim sql As String 
    Dim strLine As String = "" 
    Dim attachment As String = "attachment; filename=PTW.csv" 

    m_sBranch = ddlBranches.SelectedValue 
    m_sRegion = ddlAreas.SelectedValue 

    Dim cnn As SqlConnection = New SqlConnection("Server=XYZ;Database=abc;Trusted_Connection=yes;") 

    HttpContext.Current.Response.AddHeader("content-disposition", attachment) 
    HttpContext.Current.Response.ContentType = "text/csv" 

    cnn.Open() 

    sql = GetReportSql(m_sBranch, m_sRegion) 

    Dim cmd As SqlCommand = New SqlCommand(sql, cnn) 
    Dim dr As SqlDataReader 
    dr = cmd.ExecuteReader() 

    HttpContext.Current.Response.Write("PTW JOBS - EXPORTED ON " + DateTime.Now) 

    For i = 0 To dr.FieldCount - 1 
     strLine = strLine & dr.GetName(i).ToString & "," 
    Next 
    HttpContext.Current.Response.Write(strLine) 

    Dim sb As StringBuilder = New StringBuilder() 
    Dim temp As String = "" 
    While dr.Read() 
     For i = 0 To dr.FieldCount - 1 
      temp = temp & dr.GetValue(i) 
      temp = temp.Replace(",", " ") 
      sb.Append(temp & ",") 
      temp = "" 
     Next 
     sb.AppendLine() 
     strLine = ""        
    End While 

    HttpContext.Current.Response.Write(sb.ToString()) 

End Sub 

任何幫助將高度讚賞。謝謝。

+0

查看內容標題列表。有xslx的文檔類型。另一個選擇,因爲你似乎與Excel 2007或更高版本一起工作是看看openxml格式。自從我使用任何打開的XML之後已經過去了幾個月,但是一旦你開始使用,它就變得非常簡單,並且你將能夠生成正確的Excel 2007文檔。如果您不知道此更改爲.zip的xlsx文件擴展名,並且您將能夠打開包含組成xslx – Andrew 2011-02-25 14:09:29

回答

2

看看OpenXML SDK: 據我所知,我的示例不會轉換.csv文件,但它會引導您朝着正確的方向前進。 http://msdn.microsoft.com/en-us/library/bb448854(office.14).aspx

我用它在asp.net到動態創建的xlsx文件,直接傳輸到Web客戶端:

public static System.IO.MemoryStream ConvertToExcel(DataSet ds) 
     { 
      System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
      using (SpreadsheetDocument package = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true)) 
      { 
       package.AddWorkbookPart(); 
       package.WorkbookPart.Workbook = new Workbook(); 
       package.WorkbookPart.AddNewPart<WorksheetPart>(); 

       if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) 
       { 
        DataTable tbl = ds.Tables[0]; 
        SheetData xlSheetData = new SheetData(); 
        foreach (DataRow row in tbl.Rows) 
        { 
         Row xlRow = new Row(); 
         foreach (DataColumn col in tbl.Columns) 
         { 
          object cellData = row[col]; 
          Cell xlCell = null; 
          if (cellData != null) 
          { 
           xlCell = new Cell(new InlineString(new DocumentFormat.OpenXml.Spreadsheet.Text(cellData.ToString()))) { DataType = CellValues.InlineString }; 
          } 
          else 
          { 
           xlCell = new Cell(new InlineString(new DocumentFormat.OpenXml.Spreadsheet.Text(String.Empty))) { DataType = CellValues.InlineString }; 
          } 
          xlRow.Append(xlCell); 
         } 
         xlSheetData.Append(xlRow); 
        } 

        package.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet(xlSheetData); 
        package.WorkbookPart.WorksheetParts.First().Worksheet.Save(); 

        // create the worksheet to workbook relation 
        package.WorkbookPart.Workbook.AppendChild(new Sheets()); 
        package.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet() 
        { 
         Id = package.WorkbookPart.GetIdOfPart(package.WorkbookPart.WorksheetParts.First()), 

         SheetId = 1, 

         Name = "Sheet1" 

        }); 

        package.WorkbookPart.Workbook.Save(); 

       } 
      } 
      return stream; 
     } 
+0

Dave的所有xml組件部分的zip文件,非常感謝您將它放在正確的方向上。現在,我設法在Excel表格中打開文檔。但是,在excel中顯示文檔之前,代碼不會顯示帶有選項「打開/保存/取消」的「下載文件」彈出窗口。任何幫助。 – Shariful 2011-02-28 16:59:01

0

Shariful,從我讀過(沒有嘗試過) ,我相信最好的方法是設置您的HTTP響應標頭爲here.

簡而言之,關鍵似乎是將content-disposition標頭設置爲「attachment」。

例如爲:

Content-Disposition: attachment; filename=<file name.ext> 

對不起,我沒有測試過這一點,但我在尋找的東西密切相關,幾乎每到一個地方我就建議,以迫使下載對話框中使用此方法。