2009-02-07 2 views
2

.NET 2.0 (이 경우 VB)에는 DataSet 객체를 탭으로 구분 된 파일로 저장하고 Excel에서 직접 열 수있는 스트림으로 직렬화하는 표준 API가 있습니까? 또는 테이블 콜렉션의 멤버를 반복하여 구분 된 파일을 수동으로 생성해야합니까?System.Data.DataSet을 Excel로 가져 오는 가장 간단한 방법은 무엇입니까?

이 경우 데이터 세트는 작으며 약 10 개의 DataTable로 구성되며 각 데이터 테이블은 한 행과 수십 행 사이에 있습니다. 이 시나리오를 처리 할 수있는 메커니즘이 내장되어 있는지 궁금합니다. 상대적으로 일반적인 시나리오라고 생각하기 때문입니다.

클라이언트가 보고서 생성 단추를 클릭하고 보고서를 어셈블 링 한 다음 서식이 지정된 데이터가 포함 된 응답 개체를 반환하는 등, 한 번의 클릭으로 모든 정보를 반환 할 수 있습니다. 저장하거나 열지 묻는 메시지 (예 : 파일을 다운로드 한 다음 가져 오는 것이 불필요하게 성가신 것으로 보입니다.)

답변

4

에서 CSV

Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String) 
    DataTable2CSV(table, filename, vbTab) 
End Sub 
Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String, _ 
    ByVal sepChar As String) 
    Dim writer As System.IO.StreamWriter 
    Try 
     writer = New System.IO.StreamWriter(filename) 

     ' first write a line with the columns name 
     Dim sep As String = "" 
     Dim builder As New System.Text.StringBuilder 
     For Each col As DataColumn In table.Columns 
      builder.Append(sep).Append(col.ColumnName) 
      sep = sepChar 
     Next 
     writer.WriteLine(builder.ToString()) 

     ' then write all the rows 
     For Each row As DataRow In table.Rows 
      sep = "" 
      builder = New System.Text.StringBuilder 

      For Each col As DataColumn In table.Columns 
       builder.Append(sep).Append(row(col.ColumnName)) 
       sep = sepChar 
      Next 
      writer.WriteLine(builder.ToString()) 
     Next 
    Finally 
     If Not writer Is Nothing Then writer.Close() 
    End Try 
End Sub 

당신이 정말로 그것을 원하지 않는 한에 엑셀에 대한 ADO.NET 공급자가 있습니다. 데이터 집합이있는 경우 두 개의 데이터 어댑터를 사용하여 Oracle에서 Excel로, SQL에서 Excel로, Excel에서 Oracle로 데이터를 이동할 수 있습니다.

데이터 집합을 원본을 첫 번째 DA로 가져온 다음 대상을 두 번째 DA로 업데이트합니다. DataAdapter는 동일한 유형일 필요는 없습니다. 업데이트와 함께 읽기 전용으로 OleDbDataAdapter, SqlDataAdapter, OracleDataAdapter 등을 사용할 수 있습니다.

CSV 또는 XML 형식을 사용하지 않아도됩니다. Office 자동화를 사용할 필요가 없으므로 PIA가없고 서버에서도 작동합니다. 그것은 단지 ADO.NET입니다.

Excel에 연결하려면 Microsoft.Jet.OLEDB oledb 공급자를 사용하십시오.

Full Example source.

발췌 :

System.Data.DataSet ds1; 

const string ConnStringSql= "Provider=sqloledb;Data Source=dinoch-8;Initial Catalog=Northwind;Integrated Security=SSPI;" ; 
const string OutputFilename= "ExtractToExcel.xls"; 

const string ConnStringExcel= 
"Provider=Microsoft.Jet.OLEDB.4.0;" + 
"Data Source=" + OutputFilename + ";" + 
"Extended Properties=\"Excel 8.0;HDR=yes;\""; // FIRSTROWHASNAMES=1;READONLY=false\" 

const string sqlSelect="SELECT top 10 ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, GETDATE() as Extracted from Products order by UnitPrice"; 
const string sqlInsert="INSERT INTO Extracto (ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, Extracted) VALUES (@ProductId, @ProductName, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @Extracted)"; 

private void ReadFromSql() 
{ 
    var ConnSql= new System.Data.OleDb.OleDbConnection(ConnStringSql); 

    var da1 = new System.Data.OleDb.OleDbDataAdapter(); 
    da1.SelectCommand= new System.Data.OleDb.OleDbCommand(sqlSelect); 
    da1.SelectCommand.Connection= ConnSql; 

    ds1= new System.Data.DataSet(); 
    da1.Fill(ds1, "Extracto"); 
} 



private void InsertIntoExcel() 
{ 
    // need to update the row so the DA does the insert... 
    foreach (System.Data.DataRow r in ds1.Tables[0].Rows) 
    { 
     r.SetModified(); // mark the row as updated to force an insert 
    } 

    var da2 = new System.Data.OleDb.OleDbDataAdapter(); 

    da2.UpdateCommand= new System.Data.OleDb.OleDbCommand(sqlInsert); 
    da2.UpdateCommand.Connection= ConnExcel; 

    da2.UpdateCommand.Parameters.Add("@ProductId", System.Data.OleDb.OleDbType.Integer, 4, "ProductId"); 
    da2.UpdateCommand.Parameters.Add("@ProductName", System.Data.OleDb.OleDbType.VarWChar, 40, "ProductName"); 
    da2.UpdateCommand.Parameters.Add("@QuantityPerUnit", System.Data.OleDb.OleDbType.VarWChar, 20, "QuantityPerUnit"); 
    da2.UpdateCommand.Parameters.Add("@UnitPrice", System.Data.OleDb.OleDbType.Currency, 8, "UnitPrice"); 
    da2.UpdateCommand.Parameters.Add("@UnitsInStock", System.Data.OleDb.OleDbType.SmallInt, 2, "UnitsInStock"); 
    da2.UpdateCommand.Parameters.Add("@Extracted", System.Data.OleDb.OleDbType.Date, 8, "Extracted"); 

    da2.Update(ds1, "Extracto"); 
} 

이 엑셀 자동화 아니므로 서버에 엑셀 자동화를 사용에 적용되는주의 사항이 적용되지 않습니다.

기존 XLS 파일 (또는 XLSX)로 시작할 수 있으며 명명 된 범위 만 채울 수 있습니다. 이렇게하면 ilve 데이터를 삽입하기 전에 서식을 적용하는 등의 작업을 할 수 있습니다. 본질적으로 기존 XLS 파일은 템플릿입니다.
또는 아무것도 시작하지 않고 XLS 파일에서 XLS 파일 및 테이블/범위를 완전히 동적으로 런타임에 만들 수 있습니다. 이 경우 XLS 파일은 꽤 바닐라/평범 할 것입니다. 서식, 색상, 수식 등이 없습니다.

또한 간단한 HTML 테이블 태그 (또는있는 gridview) 다음 코드 숨김에서 page.load에서이 라인을 포함 사용하여 .aspx 페이지에 HTML의 테이블을 만들 수 있습니다
0

DataSet.writeXML(Stream) 그런 다음 XML 파일을 Excel

으로 가져올 수 있습니다

또한 this utility에서 확인할 수 있습니다.

+0

내가 왜 downvoted 되었습니까? – Malfist

+0

@Malfist : 툴팁에 따르면,이 대답은 분명히 도움이되지 못했습니다. – GEOCHET

+0

질문에 대한 답변입니다. – Malfist

-2
XML DataSet.WriteXML-

Serilize 데이터 세트와 당신이 CSV로 변환 Xsl

EDIT (당신이 XSL로 XML을 변환하기 위해 XslTransform을 사용할 수 있습니다) 만들 수는 : 다른 옵션은 직접 변환하는 것입니다 순수 Excel 형식

+0

이것은 가장 단순한 것과는 거리가 멀고 XML로 변환하는 것이 가장 간단합니다. XML은 Excel에서 직접 열 수 있습니다. – Malfist

+0

따옴표/줄 바꿈으로 값을 올바르게 인용 할 수는 없지만 매우 가깝습니다. -p –

+0

@Malfist : 저는 잘 모르겠습니다 만 모든 Excel 버전이 xml을 열 수는 없다고 생각합니다. , 내가 틀렸다면 나를 바로 잡으십시오. –

0

:

Response.ContentType = "application/vnd.ms-excel" 

즐길를 :)