簡體   English   中英

將數據從數據庫復制到excel文件,這會花費太多時間

[英]Copying data from database to excel file , it is taking too much time

我想將數據從數據庫復制到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.CountRows.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做奇怪的事情,而DateTimes實際上只是日期,因此我將它們視為特例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM