2017-07-21 5 views
0

私はNPOI ExcelのAutoSizeColumn()をエクスポートしています。このSO questionから、DataTableをエクスポートしてExcelにエクスポートするときは、AutoSizeColumn()を呼び出す前にすべてのデータを1つの列に書き込む必要があることを知っています。例:(などから、このSO answerNPOIのエクスポートはすべての列を凌駕しますが、最後は空白になります

HSSFWorkbook spreadsheet = new HSSFWorkbook(); 

DataSet results = GetSalesDataFromDatabase(); 

//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file' 
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1"); 

foreach (DataColumn column in results.Tables[0].Columns) 
{ 
    int rowIndex = 0; 
    foreach (DataRow row in results.Tables[0].Rows) 
    { 
     HSSFRow dataRow = sheet1.CreateRow(rowIndex); 
     dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); 
     rowIndex++; 
    } 
    sheet1.AutoSizeColumn(column.Ordinal); 
} 

//Write the stream data of workbook to the file 'test.xls' in the temporary directory 
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls") , FileMode.Create); 
spreadsheet.Write(file); 
file.Close(); 

私はTest.xlsをを開くと、唯一の最後の列が値を持っているすべてのものを以前のコラムでは、それには何も持っていません(列のサイズを!しかし、調整されます。

FYI:1)私はhttps://www.dotnetperls.com/datatable からGetTable()のコードを使用します。2)私はC#を使用しています。

答えて

0

私がtest.xlsを開くと、最後の列だけが値を持ちます。それらの前の列には何も入っていません! (各カラムのサイズは、しかし、調整されている。)あなたは、カラムと(再)をループ各反復上のすべての行を作成しているためだ

を。この行(再)作成ループは、古い行(以前のセルの値セットを持つ)を空白で上書きします。したがって、最後の列は空白になります。

行は列最初繰り返されるようにループの順序を切り替えてみてください:

HSSFWorkbook spreadsheet = new HSSFWorkbook(); 

DataSet results = GetSalesDataFromDatabase(); 

//here, we must insert at least one sheet to the workbook. otherwise, Excel will say 'data lost in file' 
HSSFSheet sheet1 = spreadsheet.CreateSheet("Sheet1"); 

int rowIndex = 0; 
foreach (DataRow row in results.Tables[0].Rows) 
{     
    HSSFRow dataRow = sheet1.CreateRow(rowIndex); 
    foreach (DataColumn column in results.Tables[0].Columns) 
    { 
    dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());   
    } 
    rowIndex++; 
} 

for(var i = 0; i< results.Tables[0].Columns.Count; i++) 
{ 
    sheet1.AutoSizeColumn(i); 
} 

//Write the stream data of workbook to the file 'test.xls' in the temporary directory 
FileStream file = new FileStream(Path.Combine(Path.GetTempPath(), "test.xls"), FileMode.Create); 
spreadsheet.Write(file); 
file.Close(); 
関連する問題