2013-09-23 2 views
1

이 문제에 대한 도움이 필요합니다. 데이터 테이블을 Excel 파일로 내보내는 것이 좋습니다. 문제는 열 중 하나를 문서의 하이퍼 링크로 만들려고하지만이 오류가 발생하면 Excel 파일을 빌드하기 시작할 때입니다. 당신의 도움에 미리 감사드립니다.Excel 내보내기에 href 추가 C#

'이 작업은 상대 URI에 대해서는 지원되지 않습니다.' Excel 문서 상대 에 될 수있는 URL을 가지고 있지 않는 한

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

이 의미는 ~/표기법을 사용하는 대신 절대 경로가 필요하다는 것입니다. 절대적으로 사용할 수 있습니까? 루트 디렉토리를 얻을 방법이없는 스프레드 시트로 내보낼 때 상대 경로를 사용할 수 없다는 것은 의미가 있습니다. 어쩌면 각 하이퍼 링크의 루트를 가져 와서 연결할 수 있습니까? –

+0

그래, 그게 문제라고 생각하고 표기법을 사이트 URL 플러스 위치 및 매개 변수로 바꾸었지만 여전히 같은 오류가 발생합니다. 문자열 하이퍼 링크 = "" + rw["Drawing Id"].ToString() + "" –

답변

2

엑셀은 단순히 상대 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]. 하이 링크 = 새 Uri (하이퍼 링크, 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]. 값 = rw [ "드로잉 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

내 문제를 해결할 수의 지적은 많은 새로운 ExcelPackage으로 Excelv를 사용 ()

를 ..Thanks
 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- 위로). - [리뷰에서] (리뷰/저품절 게시물/16818954) –

관련 문제