Создание файла Excel с открытым XML и ExtremML - дает «… нечитаемый контент…» - PullRequest
0 голосов
/ 13 сентября 2011

Привет всем, я использую Open XML и ExtremML для генерации файла Excel на сервере и загрузки его, но когда вы пытаетесь открыть его, он выдает мне сообщение «ОТКАЖИТЕ НАЙДЕН НЕДОСТУПНЫЙ КОНТЕНТ. ВЫ ХОТИТЕ ВОССТАНОВИТЬСОДЕРЖАНИЕ ЭТОГО РАБОЧЕГО ЖУРНАЛА? ЕСЛИ ВЫ ДОВЕРЯЕТЕ ИСТОЧНИКУ ЭТОГО РАБОЧЕГО ЖУРНАЛА, НАЖМИТЕ НА ДИСК ", поэтому, проверяя файл внутри y, он обнаруживает, что добавляет тег с именем company, что при его удалении исправляет ошибку, которую выдает Excel, он находится в VB.NET, это мой код:

Protected Sub btnExcel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExcel.Click
  Dim iProcess As String = ""
  Dim loOraClientDb As clsOraClientDb = New clsOraClientDb
  Dim vFilename As String = ""
  Try
     Try
        iProcess = "btnExcel_Click 1"
        Dim ExcelSendInfo As DataTable = Session("dtExcel")
        Dim ExcelExportedInfo As DataTable = New DataTable
        Dim PkgOutValues() As String = {}
        Dim ExcelDataSet As DataSet = New DataSet
        Dim vtablename As String = ""
        Dim vtabletoname As String = ""
        Dim WFT As New WebFileTools
        If chkFLayout.Checked Then
           iProcess = "btnExcel_Click 2"
           Dim sDNS As StringBuilder = New StringBuilder()
           If Not chkFInfo.Checked Then
              For Each dr In ExcelSendInfo.Rows
                 sDNS.AppendLine(dr(0))
              Next
           End If

           iProcess = "btnExcel_Click 3"
           If Not loOraClientDb.Open(ConnectionStrings("DatabaseSDSTP6301").ConnectionString) Then
              EnableErrorByState(loOraClientDb.Message & ", Process: " & iProcess)
              Exit Sub
           Else
              iProcess = "btnExcel_Click 4"
              Dim vStatus As String
              If ViewState("CurrentWindow") = "Report" Then
                 vStatus = "G.G_STATUSID!=2"
              Else
                 vStatus = "G.G_STATUSID=2"
              End If

              iProcess = "btnExcel_Click 5"
              Dim PkgInParameters(6)() As String
              PkgInParameters(0) = New String() {"VEXPORTEDDNS", "VARCHAR2", "Empty", sDNS.ToString.Replace(Chr(13) & Chr(10), ",")}
              PkgInParameters(1) = New String() {"VSTATUS", "VARCHAR2", "Empty", vStatus}
              PkgInParameters(2) = New String() {"chkFInfo", "VARCHAR2", "Empty", BoolToStr(chkFInfo.Checked)}
              PkgInParameters(3) = New String() {"VSEARCHOPS", "VARCHAR2", "Empty", DDLSearchOps.SelectedValue}
              PkgInParameters(4) = New String() {"VSEARCH", "VARCHAR2", "Empty", txtsearch.Text}
              PkgInParameters(5) = New String() {"VRANGE1", "VARCHAR2", "Empty", txtrange1.Text}
              PkgInParameters(6) = New String() {"VRANGE2", "VARCHAR2", "Empty", txtrange2.Text}
              Dim PkgReturnParameters() As String
              PkgReturnParameters = New String() {"VRETURN", "CURSOR", "Empty"}
              Dim PkgOutParameters(0)() As String
              PkgOutParameters(0) = New String() {"VTOTPROJS", "NUMBER", "Empty"}

              iProcess = "btnExcel_Click 6"
              If Not loOraClientDb.ExecuteProcedureFunction("PKG_GENERALINFO.GENERATEEXCEL", PkgInParameters, _
                                                      PkgOutParameters, PkgReturnParameters, , ExcelExportedInfo, _
                                                      , PkgOutValues) Then
                 EnableErrorByState(loOraClientDb.Message & ", Process: " & iProcess)
                 Exit Sub
              End If
              vtablename = "MAININFO"
              vtabletoname = "MAINTABLE"
           End If
        Else
           iProcess = "btnExcel_Click 7"
           ExcelExportedInfo = ExcelSendInfo
           vtablename = "TIMEREP"
           vtabletoname = "TIMEREPORT"
        End If

        ExcelDataSet.Tables.Add(ExcelExportedInfo)
        ExcelDataSet.Tables(0).TableName = vtablename
        Dim vFileTemplate As String = ""
        Dim RandomNumber As New Random()
        If vtablename = "MAININFO" Then
           vFileTemplate = "FullLayout.xlsx"
           vFilename = "FullLayout" & RandomNumber.Next(1000).ToString & ".xlsx"
        Else
           vFileTemplate = "TimeReport.xlsx"
           vFilename = "TimeReport" & RandomNumber.Next(1000).ToString & ".xlsx"
        End If
        Session("vfilename") = vFilename
        WFT.CopyServerFile("ExcelTemplates\" & vFileTemplate, "ExcelTemplates\" & vFilename, True)
        Using DPSExcelTemplate = ExcelOpenPackage(Server.MapPath(".") & "\ExcelTemplates", vFilename.Replace(".xlsx", ""))
           ExcelWorkBookPopulateDS2Table(DPSExcelTemplate, ExcelDataSet, vtablename, vtabletoname)
        End Using
        Server.ClearError()
        Response.Redirect("DownloadPage.aspx", False)
        iProcess = "btnExcel_Click 28"
     Catch ex As Exception
        EnableErrorByState(ex.Message & ", Process: " & iProcess)
        If File.Exists(Server.MapPath(".") & "\ExcelTemplates\" & vFilename) = True Then
           File.Delete(Server.MapPath(".") & "\ExcelTemplates\" & vFilename)
        End If
     End Try
  Finally
     loOraClientDb.Close()
     ShowCorrespondingWindows()
  End Try
End Sub

На странице DownloadPage.aspx есть этот код:

Imports WebFileTools
Imports System.IO

Partial Class DownloadPage
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim vfilename = Session("vfilename").ToString
  Dim nfilename = ""
  If vfilename.IndexOf("FullLayout") <> -1 Then
     nfilename = "FullLayout_" & Today.ToShortDateString
  Else
     nfilename = "TimeReport_" & Today.ToShortDateString
  End If
  Dim WFT As New WebFileTools
  WFT.DownloadServerFile("ExcelTemplates\" & vfilename, MIMEType.Excel2007, nfilename)
End Sub
End Class

Я не могу найти проблему, если кто-то получил эту ошибку илизнает, как решить эту проблему?

Я забыл добавить этот код, который генерирует файл Excel с ExtremMl:

Public Shared Function ExcelOpenPackage(ByVal ServerPath As String, _
                                            ByVal ExcelFileName As String) As ExtremeML.Packaging.SpreadsheetDocumentWrapper
        Dim ExcelPackage = SpreadsheetDocumentWrapper.Open(ServerPath & "\" & ExcelFileName & ".xlsx")
        Return ExcelPackage
    End Function

И это заполнить информацию в файле:

Public Shared Sub ExcelWorkBookPopulateDS2Table(ByRef ExcelPackage As ExtremeML.Packaging.SpreadsheetDocumentWrapper, _
                                                    ByRef Data As DataSet, _
                                                    ByVal DataTableName As String, _
                                                    ByVal ExcelTableName As String)
        Dim ExcelTable = ExcelPackage.WorkbookPart.GetTablePart(ExcelTableName).Table
        ExcelTable.Fill(Data, DataTableName)
    End Sub

1 Ответ

0 голосов
/ 14 сентября 2011

Я не знаю точно, почему, но проблема была с моим кодом загрузки, это было так:

Public Sub DownloadServerFile(ByVal FileToDownload As String, ByVal MIMETYPE As MIMEType,   Optional ByVal NewNameOfFileToDownload As String = "")
  Dim FileExt As String = ""
  Dim F2DArr As String = Path.GetFileName(FileToDownload)

  Current.Response.ClearContent()
  Current.Response.ClearHeaders()

  Select Case MIMETYPE
     Case WebFileTools.MIMEType.Excel2007
        Current.Response.ContentType = _
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        FileExt = ".xlsx"
     Case WebFileTools.MIMEType.Word2007
        Current.Response.ContentType = _
                "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
        FileExt = ".docx"
     Case WebFileTools.MIMEType.PowerPoint2007
        Current.Response.ContentType = _
                "application/vnd.openxmlformats-officedocument.presentationml.presentation"
        FileExt = ".pptx"
  End Select

  If NewNameOfFileToDownload.Trim.Length > 0 Then
     Current.Response.AppendHeader("content-disposition", "inline;attachment;filename=" _
                           & NewNameOfFileToDownload & FileExt)
  Else
     Current.Response.AppendHeader("content-disposition", "inline;attachment;filename=" & F2DArr)
  End If

  Current.Response.Clear()
  Current.Response.TransmitFile(Server.MapPath(".") & "\" & FileToDownload)
  Current.Response.Flush()
  If File.Exists(Server.MapPath(".") & "\" & FileToDownload) = True Then
     File.Delete(Server.MapPath(".") & "\" & FileToDownload)
  End If
  Current.ApplicationInstance.CompleteRequest()
End Sub

Теперь я изменил эту строку Current.ApplicationInstance.CompleteRequest () для Current.Response.End (), и файл получил загруженную корректность

и теперь я не могу напрямую позвонить по коду скачивания:

Server.ClearError()
        WFT.DownloadServerFile("ExcelTemplates\" & vFilename, MIMEType.Excel2007, nfilename)
        iProcess = "btnExcel_Click 28"
     Catch ex As Exception
        EnableErrorByState(ex.Message & ", Process: " & iProcess)
        If File.Exists(Server.MapPath(".") & "\ExcelTemplates\" & vFilename) = True Then
           File.Delete(Server.MapPath(".") & "\ExcelTemplates\" & vFilename)
        End If
     End Try
  Finally
     loOraClientDb.Close()
     ShowCorrespondingWindows()
  End Try

Это не является правильным способом использования Response.End, потому что он всегда выдает ошибку, но я не знаю сейчас, если это правильный способ использования Current.ApplicationInstance.CompleteRequest () или что Response.End делает что-то, что CompleteRequest не делает для того, чтобы получить правильный MIME-тип

...