C#でXLSファイル作成する。
なんか昔書いた記憶があったんだけど、ソースがどっかいったので。。。
汎用に使用できるように、DataSetから、各DataTableをそれぞれシートに保存するようなコード書きました。
なぜか手元にコードがなくなってたけど最初から書くのは大変なのでぐぐった。
データテーブルをExcelに出力するサンプルコード:アーキテクト360
こちらのコードだとDataTableだったので、適当にがりごりDataSet使うように変更。
まだテストしてないけど多分いけたっぽい。
あ、COMでエクセル参照しないと動きませんよ。
あ、20100120修正しました。
xlsSheets.Addしたときの戻り値をリリースしてなかったのでそれの追加。
RowIndexが1からだったので、ヘッダがつぶれてたので2に変更。
あとそのままこぴぺれるようにstaticクラスにしました。
static public class XlsFileCreator { static public void CreateXlsFile(DataSet ds,string path) { Microsoft.Office.Interop.Excel.Application xlsApplication = null; Microsoft.Office.Interop.Excel.Workbooks xlsBooks = null; Microsoft.Office.Interop.Excel.Workbook xlsBook = null; Microsoft.Office.Interop.Excel.Sheets xlsSheets = null; Microsoft.Office.Interop.Excel.Worksheet xlsSheet = null; Microsoft.Office.Interop.Excel.Range xlsRange = null; object tmp = null; try { xlsApplication = new Microsoft.Office.Interop.Excel.Application(); xlsApplication.DisplayAlerts = false; xlsBooks = xlsApplication.Workbooks; xlsBook = xlsBooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); xlsSheets = xlsBook.Worksheets; tmp = xlsSheets.Add(System.Reflection.Missing.Value,xlsSheets[xlsSheets.Count],ds.Tables.Count - xlsSheets.Count,Microsoft.Office.Interop.Excel.XlSheetType.xlWorksheet); int sheetIndex = 1; foreach(DataTable dt in ds.Tables) { xlsSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlsSheets[sheetIndex]; xlsSheet.Name = dt.TableName; for(int i = 0;i <= dt.Columns.Count - 1;i++) { xlsRange = (Microsoft.Office.Interop.Excel.Range)xlsSheet.Cells[1,i + 1]; xlsRange.Value2 = dt.Columns[i].ColumnName; } int sheetRowIndex = 2;//indexは1から foreach(DataRow row in dt.Rows) { int sheetColumnIndex = 1;//indexは1から foreach(DataColumn column in dt.Columns) { if(!row.IsNull(column)) { xlsRange = (Microsoft.Office.Interop.Excel.Range)xlsSheet.Cells[sheetRowIndex,sheetColumnIndex]; if(column.DataType.Name == "Integer" | column.DataType.Name == "Int32" | column.DataType.Name == "Decimal" | column.DataType.Name == "Long" | column.DataType.Name == "Double" | column.DataType.Name == "Short") { xlsRange.NumberFormatLocal = "G/標準"; } else if(column.DataType.Name == "DateTime") { xlsRange.NumberFormatLocal = "yyyy/m/d h:mm"; } else { xlsRange.NumberFormatLocal = "@"; } xlsRange.Value2 = row[column]; ReleaseComObject((object)xlsRange); sheetColumnIndex += 1; } } sheetRowIndex += 1; } sheetIndex++; } xlsBook.SaveAs(path,Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet,null,null,null,null,Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,null,null,null,null,null); } catch(Exception ex) { Console.WriteLine(ex.StackTrace); throw ex; } finally { ReleaseComObject((object)xlsRange); ReleaseComObject((object)xlsSheet); ReleaseComObject((object)xlsSheets); ReleaseComObject(tmp); if(xlsBook != null) { xlsBook.Close(true,path,false); } ReleaseComObject((object)xlsBook); ReleaseComObject((object)xlsBooks); if(xlsApplication != null) { xlsApplication.Quit(); } ReleaseComObject((object)xlsApplication); } } static private void ReleaseComObject(object target) { try { if((target != null)) { System.Runtime.InteropServices.Marshal.ReleaseComObject(target); } } finally { target = null; } } }