【问题标题】:Pasting HTML table from clipboard to Excel worksheet with VB.NET Application使用 VB.NET 应用程序将 HTML 表格从剪贴板粘贴到 Excel 工作表
【发布时间】:2016-07-08 17:23:50
【问题描述】:

我有一个有 7000 行和 60 列的 DataTable,我需要将其保存在 Excel 文件中。

循环通过DataTable 需要很长时间,而ClosedXml 库引发了一个我无法解决的异常(好几个星期)。所以我决定从DataTable创建一个HTML表格,将它添加到剪贴板,然后粘贴到网络上的通用Excel文件中。

问题是所有字符串都是用希伯来语编写的,当应用粘贴数据时,所有字符串都没有正确编码,Excel 将它们显示为问号。

注意:当我使用鼠标粘贴应用程序在剪贴板上设置的数据时,数据会按照应有的方式粘贴,不带问号。 我也尝试使用 PasteSpecial() 方法的所有 Enum 参数,但没有成功。 请查看我添加的相关代码部分。

 Public Function LoadDataTableToDivisinReport(ByVal d As DataTable, ByVal pathAndFileNameToSave As String, ByVal DbsheetNameToReplaceData As String, Optional ByVal pathToSaveImages As String = "") As Boolean
........

                Dim t As Threading.Thread
                t = New System.Threading.Thread(AddressOf createHtmlTableToClipBoard)
                t.SetApartmentState(Threading.ApartmentState.STA)
                t.Start()
                ws.Range("a1").PasteSpecial(Excel.XlPasteType.xlPasteFormats)

.........
End Function


    Private Sub createHtmlTableToClipBoard()

        Dim b As New StringBuilder
        b.Append("<table>")
        b.Append("<tr>")
        For i = 0 To dd.Columns.Count - 1
            b.Append("<th>" & dd.Columns(i).ColumnName & "</th>")

        Next
        b.Append("</tr>")



        For j = 0 To dd.Rows.Count - 1
            b.Append("<tr>")
            For i = 0 To dd.Columns.Count - 1
                b.Append("<td>")
                b.Append(dd.Rows(j).Item(i).ToString)
                b.Append("</td>")
            Next
            b.Append("</tr>")
        Next

        b.Append("</table>")

        Clipboard.SetText(b.ToString())

    End Sub

    Private dd As DataTable

更新: 感谢@ClearLogic 评论问题已解决,通用工作簿中的宏是导致该行为的原因。请参阅@ClearLogic 标记答案下方的讨论。

【问题讨论】:

    标签: .net vb.net excel encoding


    【解决方案1】:

    我会推荐 EPPlus。它在 nuget 上可用。非常易于使用。

    这是一个 c# 中的工作代码 sn-p。翻译成 vb.net 并不难

    using (ExcelPackage excelFile = new ExcelPackage(new FileInfo(fileName)))
    {
        ExcelWorksheet ws = excelFile.Workbook.Worksheets.Add("Sheet1");
        ws.Cells["A1"].LoadFromDataTable(datatable, true);
        for (int i = 1; i <= datatable.Columns.Count; i++)
        {
            ws.Column(i).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Left;
            ws.Column(i).AutoFit();
        }
    
        ws.Row(1).Style.Font.Bold = true;
        excelFile.Save();
    }
    

    编辑 vb.net代码

    Using excelFile As New ExcelPackage(New FileInfo(fileName))
            Dim ws As ExcelWorksheet = excelFile.Workbook.Worksheets.Add("Sheet1")
            ws.Cells("A1").LoadFromDataTable(datatable, True)
            For i As Integer = 1 To datatable.Columns.Count
                ws.Column(i).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Left
                ws.Column(i).AutoFit()
            Next
    
            ws.Row(1).Style.Font.Bold = True
            excelFile.Save()
        End Using
    

    【讨论】:

    • 非常感谢您提供的信息和示例,我稍后会尝试并告诉您。
    • 我将您的问题标记为答案,但现在我不明白为什么这行代码 Dim ws As ExcelWorksheet = excelFile.Workbook.Worksheets("UNITED_DB") 抛出此异常:“Vba 模块名称不能包含 unicode 字符”它假设得到一个字符串..也许你有一个线索? tnx
    • 我无法用您的代码重现该错误。我认为这与 .NET 代码无关。我猜您在默认工作表上的 excel 中定义了一个宏,并且正在抛出此错误当您打开 excel 文件时。
    • 你说得对,我从打开的工作簿事件中删除了宏,它可以工作。我在主线程中为将来会遇到该问题的开发人员更新了您的结论。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    相关资源
    最近更新 更多