【问题标题】:Parse text file and create an excel report解析文本文件并创建 Excel 报告
【发布时间】:2011-04-29 07:31:31
【问题描述】:

我的应用程序应该解析一个文本文件(相对容易)并创建一个 Excel 电子表格报告。

我应该编写一个独立的 VB.NET 应用程序来保存 excel 文件,还是应该使用 VSTO?我不确定在易于开发、可用性问题、可用 API 功能等方面是否存在任何差异。

是否有任何其他编程语言/接口/库可以让我快速开发相关的 Excel 电子表格?我说的是函数、图形等。

谢谢

【问题讨论】:

    标签: vb.net visual-studio excel vsto spreadsheet


    【解决方案1】:

    您可以利用 excel 2007 格式 (.xlsx) 轻松做到这一点 这是我所做的,你可以很容易地修改它。我基本上利用 xlsx 文件实际上只是一个包含 xml 文件的 zip 文件。

    我创建了一个名为 Empty.xlsx 的空 Excel 文件,并将其作为资源添加到我的应用程序中。 (构建动作嵌入资源)

    我还使用标准 zip 和 unzip 库,因为这是您获取 excel 文件部分的方式。

    这是我获取数据表并创建 excel 文件的方法。请注意,实际上并不需要 Excel。

       Private Function CreateExcelReport(ByVal FilePath As String, ByVal tbl As DataTable) As FileInfo
        'Just loading the excel file from the assembly, you could do it from a file also
        Dim _assembly As Assembly = Assembly.GetExecutingAssembly
        Dim xlStream As New StreamReader(_assembly.GetManifestResourceStream("YourAssembly.Empty.xlsx"))
    'Create a new fileinfo that will hold the outputed excel file with the data.
    Dim fiRet As New FileInfo(FilePath)
    
    'Im using Ionic Zip Reduced free library to break the slsx file into its subparts 
    Using z As ZipFile = ZipFile.Read(xlStream.BaseStream)
        'Grab Sheet 1 out of the file parts and read it into a string.
        Dim myEntry As ZipEntry = z("xl/worksheets/sheet1.xml")
        Dim msSheet1 As New MemoryStream
        myEntry.Extract(msSheet1)
        msSheet1.Position = 0
        Dim sr As New StreamReader(msSheet1)
        Dim strXMLData As String = sr.ReadToEnd
    
        'Grab the data in the empty sheet and swap out the data that I want 
        Dim str2 As XElement = CreateSheetData(tbl)
        Dim strReplace As String = strXMLData.Replace("<sheetData/>", str2.ToString)
        z.UpdateEntry("xl/worksheets/sheet1.xml", strReplace)
        'This just rezips the file with the new data it doesnt save to disk
        z.Save(fiRet.FullName)
    End Using
    
    'Return a Fileinfo class to be saved to disk or DB or streamed to browser
        Return fiRet
    End Function
    
    
    
    
    Private Function CreateSheetData(ByVal dt As DataTable) As XElement
    
    Dim sheedata As XElement = <sheetData></sheetData>
    
    'Create Header Rows
    Dim HeaderRow As New XElement(<row></row>)
    For j = 0 To dt.Columns.Count - 1
        Dim c As New XElement(<c t="inlineStr"></c>)
        Dim _is As New XElement(<is></is>)
        Dim v As New XElement(<t></t>)
        v.Add(dt.Columns(j).ColumnName)
        _is.Add(v)
        c.Add(_is)
        HeaderRow.Add(c)
    Next
    sheedata.Add(HeaderRow)
    
    'Create row for each datarow
    For Each dr As DataRow In dt.Rows
        Dim newrow As New XElement(<row></row>)
        For j = 0 To dt.Columns.Count - 1
            Dim c As New XElement(<c t="inlineStr"></c>)
            Dim _is As New XElement(<is></is>)
            Dim v As New XElement(<t></t>)
            v.Add(dr(j).ToString)
            _is.Add(v)
            c.Add(_is)
            newrow.Add(c)
        Next
        sheedata.Add(newrow)
    
    Next
    
    
        Return sheedata
    
    End Function
    

    【讨论】:

    • 请注意,我没有使用excel,一切都在内存中完成。速度很快。
    【解决方案2】:

    至于您以何种形式开发此应用程序,这完全取决于您。我会根据您想要使用的部署类型来确定。

    如果您选择在 Excel 之外执行此操作,那么我会查看 EPPlus。

    【讨论】:

      【解决方案3】:

      对于商业图书馆,您应该查看Aspose Cells 和SpreadsheetGear。

      我已经有一段时间没有使用这两种方法了,但我记得 Aspose 方法专注于从代码调用他们的库,不需要 Excel,而 SpreadsheetGear 则更受模板驱动。

      【讨论】:

      • SpreadsheetGear 允许您从模板开始并对其进行修改,或者从新的空工作簿开始并使用全面的 API - 这恰好与 Excel 的 API 非常相似。
      猜你喜欢
      • 2021-08-30
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多