2013-09-23 37 views
1

我需要幫助解決這個問題,我正在將我的數據表導出到可以正常工作的excel文件中。問題是我試圖讓其中一個列超鏈接到文檔,但當它開始建立Excel文件時,我得到這個錯誤。預先感謝您的幫助。添加href到Excel導出C#

'此操作不支持相對URI'。

using OfficeOpenXml; 
using OfficeOpenXml.Table; 

public void ExportExcelFile(System.Data.DataTable excelData, string excelSheetName) 
    { 
     using (var package = new ExcelPackage()) 
     { 
      ExcelWorksheet ws = package.Workbook.Worksheets.Add(excelSheetName); 

      int rowCount = 1; 
      foreach (DataRow rw in excelData.Rows) 
      { 
       //excelData.Columns.RemoveAt(0); 
       rowCount += 1; 
       for (int i = 1; i < excelData.Columns.Count + 1; i++) 
       { 
        // Add the header the first time through 
        if (rowCount == 2) 
        { 
         ws.Row(1).Style.Font.Bold = true; 
         ws.Cells[1, i].Value = excelData.Columns[i - 1].ColumnName; 
        } 
        ws.Column(i).AutoFit(); 

        //THIS IS THTE PROBLEM 
        string hyperlink = "<a href='~/Documents/DownloadFile.aspx?id=" + rw["DocPk"].ToString() + "'>" + rw["Drawing Id"].ToString() + "</a>"; 
        ws.Cells[i, 7].Hyperlink = new Uri(hyperlink, UriKind.RelativeOrAbsolute); 

        ws.Cells[rowCount, i].Value = rw[i - 1].ToString(); 
       } 
      } 

      MemoryStream Result = new MemoryStream(); 
      package.SaveAs(Result); 
      Response.ClearContent(); 
      Response.OutputStream.Write(Result.GetBuffer(), 0, Result.GetBuffer().Length); 
      Response.OutputStream.Flush(); 
      Response.OutputStream.Close(); 
      byte[] byteArray = Result.ToArray(); 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + excelSheetName + ".xlsx"); 
      Response.AddHeader("Content-Length", byteArray.Length.ToString()); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.BinaryWrite(byteArray); 
      Response.End(); 
     } 
    } 
+1

這意味着你需要一個絕對路徑而不是使用〜/ notation。你有可能使用絕對的?這是有道理的,你不能使用相對路徑,因爲你試圖導出到一個電子表格可能無法獲得您的根目錄。也許你可以得到每個超鏈接的根目錄並連接? –

+0

是的,我認爲這是問題,我用網站的URL加上位置和參數替換了符號,但我仍然得到相同的錯誤。字符串超鏈接=「" + rw["Drawing Id"].ToString() + "」 –

回答

2

Excel中根本不支持相對URL,作爲一個Excel文件不具有URL是相對。你需要完全限定所有URL:

string hyperlink = String.Format("http://{0}/Documents/DownloadFile.aspx?id={1}", 
    Page.Request.Url.Host, 
    rw["DocPk"].ToString()); 

ws.Cells[rowCount, i].Hyperlink = new Uri(hyperlink, UriKind.Absolute); 
ws.Cells[rowCount, i].Value = rw["Drawing Id"]; 

注完全合格的URL,完成的http://還有UriKind.Absolute

+0

我做了一些改變,但我仍然得到ws.Cells [rowCount,i] .Hyperlink = new Uri(超鏈接,UriKind.Absolute)的錯誤; (字符串)超鏈接的格式正如您所建議的那樣 –

+0

即使使用'UriKind.Absolute',您仍然會收到同樣的錯誤?很奇怪!恐怕我沒有想法。 –

+0

下面是問題的解決方案:var hyperlink = String.Format(「Http://」+ Page.Request.Url.Host +「/Documents/DownloadFile.aspx?id={0}」,rw [「DocPk 「]的ToString()); ws.Cells [rowCount,i] .Hyperlink = new Uri(hyperlink,UriKind.Absolute); ws.Cells [rowCount,i] .Style.Font.UnderLine = true; ws.Cells [rowCount,i] .Style.Font.Color.SetColor(System.Drawing.Color.Blue); ws.Cells [rowCount,i] .Value = rw [「Drawing Id」]; –

0

這裏是固定的,工作液,感謝邁克的幫助讓我在正確的方向

public void ExportExcelFile(System.Data.DataTable excelData, string excelSheetName) 
    { 
     using (var package = new ExcelPackage()) 
     { 
      ExcelWorksheet ws = package.Workbook.Worksheets.Add(excelSheetName); 
      HtmlAnchor lnkOpen = new HtmlAnchor(); 
      int rowCount = 1; 
      foreach (DataRow rw in excelData.Rows) 
      { 

       rowCount += 1; 
       for (int i = 1; i < excelData.Columns.Count + 1; i++) 
       { 
        // Add the header the first time through 
        if (rowCount == 2) 
        { 
         ws.Row(1).Style.Font.Bold = true; 
         ws.Cells[1, i].Value = excelData.Columns[i - 1].ColumnName; 
        } 
        ws.Column(i).AutoFit(); 

        if (excelData.Columns[i - 1].ColumnName.ToString() == "Drawing Id") 
        { 
        //var hyperlink = String.Format("Http://" + Page.Request.Url.Host + "/Documents/DownloadFile.aspx?id={0}", rw["DocPk"].ToString()); 
        var hyperlink = String.Format(ConfigurationManager.AppSettings["DocumentManagerURL"] + "Documents/DownloadFile.aspx?id={0}", rw["DocPk"].ToString()); 
         ws.Cells[rowCount, i].Hyperlink = new Uri(hyperlink, UriKind.Absolute); 
         ws.Cells[rowCount, i].Style.Font.UnderLine = true; 
         ws.Cells[rowCount, i].Style.Font.Color.SetColor(System.Drawing.Color.Blue); 
         ws.Cells[rowCount, i].Value = rw["Drawing Id"]; 

        } 
        else{ 
         ws.Cells[rowCount, i].Value = rw[i - 1].ToString(); 
        } 

       } 
       //excelData.Columns.RemoveAt(7); 
      } 

      MemoryStream Result = new MemoryStream(); 
      package.SaveAs(Result); 
      Response.ClearContent(); 
      Response.OutputStream.Write(Result.GetBuffer(), 0, Result.GetBuffer().Length); 
      Response.OutputStream.Flush(); 
      Response.OutputStream.Close(); 
      byte[] byteArray = Result.ToArray(); 
      Response.AddHeader("Content-Disposition", "attachment; filename=" + excelSheetName + ".xlsx"); 
      Response.AddHeader("Content-Length", byteArray.Length.ToString()); 
      Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
      Response.BinaryWrite(byteArray); 
      Response.End(); 
     } 
    } 
0

最後能解決我的問題,指出..Thanks很多 使用Excelv作爲新ExcelPackage()

 Dim ws As ExcelWorksheet = Excelv.Workbook.Worksheets.Add(fileName) 

     Dim rowCount As Integer = 1 
     For Each rw As DataRow In dddd.Rows 
      'excelData.Columns.RemoveAt(0); 
      rowCount += 1 
      For i As Integer = 1 To dddd.Columns.Count 
       ' Add the header the first time through 
       If rowCount = 2 Then 
        'ws.Row(1).Style.Fill.BackgroundColor.SetColor(Color.Azure) 
        ws.Row(1).Style.Font.Bold = True 
        'ws.Row(1).Style.Fill.BackgroundColor.SetColor(Color.AliceBlue) 
        ' ws.Row(1).Style.Color = "#FFFFFF" 
        If dddd.Columns(i - 1).ColumnName = ("ID") Then 
         'ws.Cells(1, i).Value = dddd.Columns(i - 1).ColumnName 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Plant_Description") Then 
         ws.Cells(1, i).Value = "Plant" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Report_No") Then 
         ws.Cells(1, i).Value = "Scrap Number" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Req_Emp_Name") Then 
         ws.Cells(1, i).Value = "Originator" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("ScrapItem_Desc") Then 
         ws.Cells(1, i).Value = "Item" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Info_ID") Then 
         ws.Cells(1, i).Value = "NO" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Itemdesc") Then 
         ws.Cells(1, i).Value = "ItemDesc" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Part_No") Then 
         ws.Cells(1, i).Value = "Part No" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("quantity") Then 
         ws.Cells(1, i).Value = "Quantity" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("STD_Cost") Then 
         ws.Cells(1, i).Value = "UnitPrice" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Total_Cost") Then 
         ws.Cells(1, i).Value = "UnitTotal" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Close_DateTime") Then 
         ws.Cells(1, i).Value = "Close Date" 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Doc_Create_Date") Then 
         ws.Cells(1, i).Value = "Submit Date" 
        Else 
         ws.Cells(1, i).Value = dddd.Columns(i - 1).ColumnName 
        End If 

       End If 
       ws.Column(i).AutoFit() 
       'ws.Column("ID").Hidden = True 
       'THIS IS THTE PROBLEM 
       'Dim hyperlink As String = "<a href='~/Documents/DownloadFile.aspx?id=" + rw("ID").ToString() + "'>" + rw("ID").ToString() + "</a>" 
       'ws.Cells(i, 7).Hyperlink = New Uri(hyperlink, UriKind.RelativeOrAbsolute) 

       'ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 

       'Dim hyperlink As String = [String].Format("http://{0}/Documents/DownloadFile.aspx?id={1}", Page.Request.Url.Host, rw("ID").ToString()) 

       'ws.Cells(rowCount, i).Hyperlink = New Uri(hyperlink, UriKind.Absolute) 
       'ws.Cells(rowCount, i).Value = rw("Drawing Id") 


       If dddd.Columns(i - 1).ColumnName.ToString() = "Month" Then 
        'var hyperlink = String.Format("Http://" + Page.Request.Url.Host + "/Documents/DownloadFile.aspx?id={0}", rw["DocPk"].ToString()); 
        Dim hyperlink = [String].Format("your url" + "{0}", rw("ID").ToString()) 
        ws.Cells(rowCount, i).Hyperlink = New Uri(hyperlink, UriKind.RelativeOrAbsolute) 
        ws.Cells(rowCount, i).Style.Font.UnderLine = True 
        ws.Cells(rowCount, i).Style.Font.Color.SetColor(System.Drawing.Color.Blue) 

        ws.Cells(rowCount, i).Value = rw("Month") 
       Else 
        If dddd.Columns(i - 1).ColumnName = ("ID") Then 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Plant_Description") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Report_No") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Req_Emp_Name") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("ScrapItem_Desc") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Info_ID") Then 
         ws.Cells(rowCount, i).Value = Convert.ToInt32(rw(i - 1).ToString()) 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Itemdesc") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Part_No") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("quantity") Then 
         ws.Cells(rowCount, i).Value = Convert.ToDecimal(rw(i - 1).ToString()) 
        ElseIf dddd.Columns(i - 1).ColumnName = ("STD_Cost") Then 
         ws.Cells(rowCount, i).Value = Convert.ToDecimal(rw(i - 1).ToString()) 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Total_Cost") Then 
         ws.Cells(rowCount, i).Value = Convert.ToDecimal(rw(i - 1).ToString()) 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Close_DateTime") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        ElseIf dddd.Columns(i - 1).ColumnName = ("Doc_Create_Date") Then 
         ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
        Else 
         ws.Cells(1, i).Value = dddd.Columns(i - 1).ColumnName 
        End If 
        'ws.Cells(rowCount, i).Value = rw(i - 1).ToString() 
       End If 
      Next 
     Next 

     Dim Result As New MemoryStream() 

     Excelv.SaveAs(Result) 
     Response.ClearContent() 
     Response.OutputStream.Write(Result.GetBuffer(), 0, Result.GetBuffer().Length) 
     Response.OutputStream.Flush() 
     Response.OutputStream.Close() 
     Dim byteArray As Byte() = Result.ToArray() 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx") 
     Response.AddHeader("Content-Length", byteArray.Length.ToString()) 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
     Response.BinaryWrite(byteArray) 
     Response.[End]() 

    End Using 
+0

請不要添加「謝謝」作爲答案。一旦你有足夠的[聲譽](https://stackoverflow.com/help/whats-reputation),你就可以[提出問題和答案](https://stackoverflow.com/help/privileges/vote- )你發現有幫助。 - [來自評論](/ review/low-quality-posts/16818954) –