使用VB.NET应用程序将HTML表格从剪贴板粘贴到Excel工作表中
我有一个有7000行和60列的DataTable
,我需要将它保存在Excel文件中。
在DataTable
循环需要很多时间,而ClosedXml库是引发了一个我无法解决的exception(几个星期)。 所以我决定从DataTable
创build一个HTML表格,将其添加到剪贴板并粘贴到networking上的通用Excel文件中。
问题是所有的string都是用希伯来语写的,当应用程序粘贴数据时,所有的string都不能正确编码,而Excel将它们显示为问号。
注意:当我使用我的鼠标粘贴应用程序在剪贴板上设置的数据时,数据将被粘贴,而不会出现问号。 此外,我试图使用PasteSpecial()
方法的所有枚举参数没有成功。 请参阅我添加的相关代码部分。
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评论问题已经解决,在通用工作簿中的macros是该行为的原因。 请参阅下面的讨论@ClearLogic标记的答案。
我会推荐EPPlus 。 它可在nuget.Very易于使用。
这是一个在C#中工作的代码片段。 翻译成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