我想将数据从数据库复制到excel文件,我使用循环来做到这一点但是当数据库中有很多行时需要花费太多时间,请建议我任何替代方法谢谢
Microsoft.Office.Interop.Excel.Application xapp = new Microsoft.Office.Interop.Excel.Application();
Workbook xlWorkBook;
Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;
xlWorkBook = xapp.Workbooks.Add(misValue);
xlWorkSheet = (Worksheet)xlWorkBook.Worksheets.get_Item(3);
xlWorkSheet.Name = "Customer Details";
//*********************************************gettting data from sql database to worksheet*********
sqlconn.Open();
sqlcmd = new SqlCommand("SELECT * from customer ", sqlconn);
sqlreader = sqlcmd.ExecuteReader();
xlWorkSheet.Cells[1, 1] = "S.No.";
xlWorkSheet.Cells[1, 2] = "Customer ID";
xlWorkSheet.Cells[1, 3] = "Customer Name";
xlWorkSheet.Cells[1, 4] = "Address";
xlWorkSheet.Cells[1, 5] = "Country";
int i = 1;
int j = 0;
while (sqlreader.Read())
{
i++;
for (j = 1; j <= 5; j++)
xlWorkSheet.Cells[i, j] = sqlreader.GetValue(j).ToString();
}
sqlreader.Close();
sqlconn.Close();
xlWorkBook.SaveAs("d:\\"+fileName, XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
xlWorkBook.Close(true, misValue, misValue);
xapp.Quit();
单独向Excel单元格写入值总是非常慢。使用范围要快很多。这个语法是:
Microsoft.Office.Interop.Excel.Range aRange = ws.get_Range(startCell, lastCell);
aRange.Value2 = args;
args是你根据数据创建的object[,]
(我的偏好是使用DataTable
而不是Reader
,因为它使得在推广之前更容易对数组进行维度 - 你可以访问Columns.Count
和Rows.Count
)。
startCell和lastCell采用Excel“A1”格式。我有一个方便的小方法从r1c1格式返回“A1”格式,这在列和行是动态时非常有用,特别是对于计算范围中的最后一个单元格。
private string GetCellName(int row, int col)
{
string result;
char[] letters = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N',
'O','P','Q','R','S','T','U','V','W','X','Y','Z'};
int offset = 0;
while (col > 26)
{
col -= 26;
offset++;
}
result = "";
if (offset > 0)
{
result += letters[offset - 1];
}
result += letters[col - 1];
result += row.ToString();
return (result);
}
HTH
编辑
要将DataTable
转换为object[,]
,我使用以下内容:
private object[,] DataTableToObjArr(System.Data.DataTable dt)
{
int colCount = 0;
int rowCount = 0;
var args = new object[dt.Rows.Count, dt.Columns.Count];
foreach (DataRow dr in dt.Rows)
{
colCount = 0;
object[] items = dr.ItemArray;
foreach (object o in items)
{
string nextItem = "";
if (o is DateTime)
{
DateTime test = (DateTime)o;
if ((test.Hour == 0) && (test.Minute == 0) && (test.Second == 0))
{
nextItem = ((DateTime)o).ToString("dd-MMM-yy");
}
else
{
nextItem = ((DateTime)o).ToString("dd-MMM-yyyy hh:mm:ss");
}
}
else
{
nextItem = o.ToString();
}
args[rowCount, colCount] = nextItem;
colCount++;
}
rowCount++;
}
return args;
}
您会注意到我区分了DateTime
和其他对象类型。根据我的经验,大多数类型可以原样传递到对象数组中。我发现Excel使用DateTimes
做奇怪的事情,实际上只是日期,所以我将它们视为特例。