だらだらやるよ。

こげつのIT技術メモ

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