【问题标题】:How to copy DataTable to Excel File using OLEDB? [duplicate]如何使用 OLEDB 将 DataTable 复制到 Excel 文件? [复制]
【发布时间】:2013-05-29 04:34:57
【问题描述】:

我正在编写一个程序,使用 oledb 将数据发送到 excel。 我使用了如下更新语句:

OleDbConnection MyConnection = new OleDbConnection(@"provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + GeneralData.excelPath + "';Extended Properties=Excel 8.0;")
MyConnection.Open();
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = MyConnection;
myCommand.CommandType = System.Data.CommandType.Text;
 string sql = "Update [test$] set press = " + pointsProperties[i].Pressure + ", temp = " + pointsProperties[i].Temperature + " where id= " + id;
myCommand.CommandText = sql;
myCommand.ExecuteNonQuery();

问题是我会使用 sql 语句超过 100 次,这需要很多时间,所以我认为使用数据表会花费更少的时间,所以我写了一个代码将我的数据保存在数据表中,如下所示:

public static System.Data.DataTable ExcelDataTable = new System.Data.DataTable("Steam Properties");

static System.Data.DataColumn columnID = new System.Data.DataColumn("ID", System.Type.GetType("System.Int32"));
static System.Data.DataColumn columnPress = new System.Data.DataColumn("Press", System.Type.GetType("System.Int32"));
static System.Data.DataColumn columnTemp = new System.Data.DataColumn("Temp", System.Type.GetType("System.Int32"));

public static void IntializeDataTable() // Called one time in MDIParent1.Load()
        {
            columnID.DefaultValue = 0;
            columnPress.DefaultValue = 0;
            columnTemp.DefaultValue = 0;

            ExcelDataTable.Columns.Add(columnID);
            ExcelDataTable.Columns.Add(columnPress);
            ExcelDataTable.Columns.Add(columnTemp);
        }

public static void setPointInDataTable(StreamProperties Point)
        {
            System.Data.DataRow ExcelDataRow = ExcelDataTable.NewRow(); // Must be decleared inside the function
                                                                        // It will raise exception if decleared outside the function
            ExcelDataRow["ID"] = Point.ID;
            ExcelDataRow["Press"] = Point.Pressure;
            ExcelDataRow["Temp"] = Point.Temperature;

            ExcelDataTable.Rows.Add(ExcelDataRow);
        }

问题是我不知道:

1- 第二种方式更快吗?

2-如何将数据表复制到excel文件中?

谢谢。

【问题讨论】:

    标签: c# excel datatable oledb


    【解决方案1】:
    //Dump the datatable onto the sheet in one operation
    public void InsertDataTableIntoExcel(Application xlApp, DataTable dt, Reectangle QueryDataArea)
    {   
        TurnOnOffApplicationSettings(false);
        using (var rn = xlApp.Range[ColumnNumberToName(QueryDataArea.X) + QueryDataArea.Y + ":" + ColumnNumberToName(QueryDataArea.X + QueryDataArea.Width - 1) + (QueryDataArea.Y + QueryDataArea.Height)].WithComCleanup())
        {
            rn.Resource.Value2 = Populate2DArray(dt);
        }
        TurnOnOffApplicationSettings(true);
    }
    
    private object[,] Populate2DArray(DataTable dt)
    {
        object[,] values = (object[,])Array.CreateInstance(typeof(object), new int[2] { dt.Rows.Count + 1, dt.Columns.Count + 1}, new int[2] { 1, 1 });
    
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                values[i + 1, j + 1] = dt.Rows[i][j] == DBNull.Value ? "" : dt.Rows[i][j];
            }
        }
        return values;
    }
    
    public static string ColumnNumberToName(Int32 columnNumber)
    {
        Int32 dividend = columnNumber;
        String columnName = String.Empty;
        Int32 modulo;    
        while (dividend > 0)
        {
            modulo = (dividend - 1)%26;
            columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
            dividend = (Int32) ((dividend - modulo)/26);
        }    
        return columnName;
    }
    
    public static Int32 ColumnNameToNumber(String columnName)
    {
        if (String.IsNullOrEmpty(columnName)) throw new ArgumentNullException("columnName");    
        char[] characters = columnName.ToUpperInvariant().ToCharArray();    
        Int32 sum = 0;    
        for (Int32 i = 0; i < characters.Length; i++)
        {
            sum *= 26;
            sum += (characters[i] - 'A' + 1);
        }    
        return sum;
    }
    
    private static XlCalculation xlCalculation = XlCalculation.xlCalculationAutomatic;
    public void TurnOnOffApplicationSettings(Excel.Application xlApp, bool on)
    {
        xlApp.ScreenUpdating = on;
        xlApp.DisplayAlerts = on;
        if (on)
        {       
            xlApp.Calculation = xlCalculation;
        }
        else
        {
            xlCalculation = xlApp.Calculation;
            xlApp.Calculation = XlCalculation.xlCalculationManual;
        }
        xlApp.UserControl = on;
        xlApp.EnableEvents = on;
    }
    

    WithComCleanup() 是 VSTO Conrtib 库。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多