VB.NET (Windows Forms) 응용 프로그램에서 Excel로 내보내기를 수행하려고합니다.Interop없이 Excel 내보내기
Excel이 설치되어 있지 않아도 응용 프로그램이 모든 컴퓨터에서 작동해야하기 때문에 Office Interops를 사용할 수 없습니다.
Public Sub ExportDatasetToExcel(ByVal ds As DataSet, Optional ByVal strHeader As String = "Save As")
'Proudly copied from:
'http://www.daniweb.com/software-development/vbnet/threads/368400/write-into-excel-using-oledb-connection#post1583200
Dim fileSave As New SaveFileDialog()
fileSave.Filter = "Excel 97-2003 Workbook (*.xls)|*.xls"
fileSave.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
fileSave.Title = strHeader
fileSave.ShowDialog()
Dim xlsFilePath As String = fileSave.FileName
If xlsFilePath = "" Then
Exit Sub
End If
System.IO.File.Copy(storagePath & "\" & "empty.xls", xlsFilePath)
Cursor.Current = Cursors.WaitCursor
Dim conn As New OleDb.OleDbConnection(String.Format("provider=Microsoft.Jet.OLEDB.4.0; Data Source='{0}';" & "Extended Properties='Excel 8.0;HDR=YES;'", xlsFilePath))
conn.Open()
Dim strTableQ(ds.Tables.Count) As String
Dim i As Integer = 0
'making table query
For i = 0 To ds.Tables.Count - 1
strTableQ(i) = "CREATE TABLE [" & ds.Tables(i).TableName & "]("
Dim j As Integer = 0
For j = 0 To ds.Tables(i).Columns.Count - 1
Dim dCol As DataColumn
dCol = ds.Tables(i).Columns(j)
strTableQ(i) &= " [" & dCol.ColumnName & "] varchar(255) , "
Next
strTableQ(i) = strTableQ(i).Substring(0, strTableQ(i).Length - 2)
strTableQ(i) &= ")"
Dim cmd As New OleDb.OleDbCommand(strTableQ(i), conn)
cmd.ExecuteNonQuery()
Next
'making insert query
Dim strInsertQ(ds.Tables.Count - 1) As String
For i = 0 To ds.Tables.Count - 1
strInsertQ(i) = "Insert Into " & ds.Tables(i).TableName & " Values ("
For k As Integer = 0 To ds.Tables(i).Columns.Count - 1
strInsertQ(i) &= "@" & ds.Tables(i).Columns(k).ColumnName & " , "
Next
strInsertQ(i) = strInsertQ(i).Substring(0, strInsertQ(i).Length - 2)
strInsertQ(i) &= ")"
Next
'Now inserting data
For i = 0 To ds.Tables.Count - 1
For j As Integer = 0 To ds.Tables(i).Rows.Count - 1
Dim cmd As New OleDb.OleDbCommand(strInsertQ(i), conn)
For k As Integer = 0 To ds.Tables(i).Columns.Count - 1
cmd.Parameters.AddWithValue("@" & ds.Tables(i).Columns(k).ColumnName.ToString(), ds.Tables(i).Rows(j)(k).ToString())
Next
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
Next
conn.Close()
conn.Dispose()
Cursor.Current = Cursors.Default
End Sub
이 코드는 작동하고 .xls 파일 내 데이터 세트를 내 보냅니다
나는 인터넷에서 다음과 같은 샘플을 발견했다.문제 : 프로그램 실행 중에이 파일을 열 수 없습니다. 내 프로그램이 여전히이 파일을 처리하고있는 것 같습니다. Sysinternals Process Explorer를 사용할 때마다이를 볼 수 있습니다. 프로그램을 닫으면 아무 문제없이이 파일을 열 수 있습니다.
개체를 파괴하거나 파일을 닫아야한다고 생각합니다. 누구든지 멍청한 놈이 그것을 성취하도록 도울 수 있습니까?
이렇게하면 공급자를 컴퓨터에 설치해야합니다. 제트는 기본적으로 어디 에나 존재하지 않는 것처럼 보입니다. 왜 OpenXml로 전환하지 않습니까? .xlsx 파일은 호환성 팩이있는 이전 버전의 Excel에서 열 수 있습니다. 그냥 생각 ... – Chris
Ditto XML - a.WriteXML 메서드로 DataTable. 테이블에 .Name을 제공해야합니다. 사용자는 File Open에서 파일을 열거 나 Excel에서 끌어다 놓을 수 있습니다. 또는 쉽게 열 수있는 .CSV 파일을 만듭니다. Kellerman Software는 값이 싼 .Net CSV (그리고 Excel for I think) 라이브러리를 가지고 있습니다. – rheitzman
@Chris : 나는 OpenXML로 아이디어를 좋아한다. [noob-aware] 샘플을 어디에서 찾을 수 있습니까? – Alexander