データテーブルをxlsファイルにエクスポートしようとしています。私がしたい、特定の理由から.NETを使用してXLS列のデータ型を変更する方法
using ExcelIt = Microsoft.Office.Interop.Excel;
protected void Export2xlsWorkBook(string filename)
{
if (filename != string.Empty)
{
if (filename.EndsWith(".xls"))
filename = txtNewFileName.Text + ".xls";
}
else
filename = "NewFile.xls";
filename = "C:\\Documents and Settings\\My Documents\\Exported XLS\\" + filename;
ExcelIt.Application objXL = new ExcelIt.Application();
ExcelIt.Workbook oWB;
ExcelIt.Worksheet oSheet;
ExcelIt.Range oRange;
objXL.Visible = true;
objXL.DisplayAlerts = false;
oWB = objXL.Workbooks.Add(Missing.Value);
DataTable dt = CreateDataTable();
oSheet = (ExcelIt.Worksheet)oWB.ActiveSheet;
oSheet.Name = "Exported Table";
int rowCount = 1;
foreach (DataRow dr in dt.Rows)
{
rowCount += 1;
for (int i = 1; i < dt.Columns.Count + 1; i++)
{
if (rowCount == 2)
{
oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName;
}
oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
}
}
oRange = oSheet.get_Range(oSheet.Cells[1, 1],
oSheet.Cells[rowCount, dt.Columns.Count]);
oRange.EntireColumn.AutoFit();
oRange = oSheet.get_Range(oSheet.Cells[1, 2], oSheet.Cells[rowCount + 10, dt.Columns.Count]);
oSheet.Protection.AllowEditRanges.Add("NonePK", oRange, Missing.Value);
oRange = oSheet.get_Range(oSheet.Cells[rowCount + 1, 1], oSheet.Cells[rowCount + 10, 1]);
oSheet.Protection.AllowEditRanges.Add("PKEmptyRow", oRange, Missing.Value);
oSheet._Protect(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
oSheet = null;
oRange = null;
oWB.SaveAs(filename, ExcelIt.XlFileFormat.xlWorkbookNormal,
Missing.Value, Missing.Value, Missing.Value, Missing.Value,
ExcelIt.XlSaveAsAccessMode.xlExclusive,
Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value);
oWB.Close(Missing.Value, Missing.Value, Missing.Value);
oWB = null;
objXL.Quit();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
:以下は私のコードであるすべての列を設定し をテキストに型。 現在、私は何も指定しなかったので、データ型は代わりに「一般」に設定されます。
誰かがこれを達成する方法についてアドバイスできますか?あなたが使用することができます よろしく
私はあなたがCOMのクリーンアップをしないことに気づきました。 Interopのすべての参照でこれを行います。それが助けて欲しい! if(writeRange!= null) { Marshal.FinalReleaseComObject(writeRange); writeRange = null; } –