2016-07-08 8 views
0

私はDataTableに7000行と60列あり、Excelファイルに保存する必要があります。VB.NETアプリケーションでクリップボードからExcelワークシートにHTMLテーブルを貼り付け

DataTableのルーピングには多くの時間がかかり、ClosedXmlライブラリの例外が発生しています(何週間も)解決できませんでした。だから、私はDataTableからHTMLテーブルを作成し、それをクリップボードに追加し、ネットワーク上の汎用Excelファイルに貼り付けることに決めました。

問題はすべての文字列がヘブライ語で書かれていて、アプリケーションがデータを貼り付けるときにすべての文字列が正しくエンコードされず、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 

UPDATE:@ClearLogicに おかげで問題にコメントを解決した、一般的なワークブック内のマクロは、その行動の原因でした。 @ClearLogicと答えたディスカッションをご覧ください。

答えて

2

EPPlusをお勧めします。ナゲットで入手できます。使いやすいです。

ここには、C#で動作するコードスニペットがあります。 vb.netへの翻訳は 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 
+0

困難

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(); } 

編集ではないでしょうについては、例えばどうもありがとうございました、私は後でそれを試してみて、あなたをできるようになります知っている。 – jonathana

+0

私は答えとしてあなたの質問をマークしましたが、なぜこの行のコードが暗いのか理解できません。ExcelWorksheet = excelFile.Workbook.Worksheets( "UNITED_DB")はこの例外をスローします: "VBAモジュール名にはユニコード文字を含めることはできません"あなたは手がかりを持っているかもしれません? tnx – jonathana

+0

私はあなたのコードでエラーを再現することができませんでした。これは、.NETコードに関連しているとは思わない。私の推測では、Excelを開いているときにデフォルトのワークシートとExcelでマクロが定義されているファイル。 – ClearLogic

関連する問題