writing multiple tables on same excel sheet with oledb

僤鯓⒐⒋嵵緔 提交于 2019-12-23 23:22:32

问题


i'm creating excel file with xmlwriter and its become too large file about 250mb because of xml attribute and file type spreadsheet. i cannot use interop , because user doesnt want to set up office on server or 3rd part dll. Now i think , i should use Oledb for creating excel file . My problem is i cant write multiple table on same sheet with oledb.

Error:

data type mismatch in criteria expression

My Code:

           connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";
           connectionString = string.Format(connectionString, outputFile, "YES");

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();


                foreach (var item in dataSetList)
                {
                    DataSet data = (DataSet)item.Value;
                    // creates the excel sheet



                    //DataSet data = item.Keys
                    //Iterate the tables in the dataset.
                    //Each table will become a tab or sheet in the workbook.
                    int maxcount = 0;
                    for (int kl = data.Tables.Count-1; kl >=0; kl--)
                    {
                        DataTable dt = data.Tables[kl];
                        string sheetSql1 = "";
                        if (dt.Columns.Count > maxcount)
                            maxcount = dt.Columns.Count;

                        var tableSchemaName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        if (tableSchemaName.Select("TABLE_NAME='" + data.DataSetName + "$'").Length == 0)
                        {
                            sheetSql1 = "CREATE TABLE [" + data.DataSetName + "] (";
                            if (dt.Columns.Count > 0)
                            {
                                //if (!dt.Columns[0].ColumnName.StartsWith("somespecificcaption"))
                                //{
                                for (int i = 0; i < dt.Columns.Count; i++)
                                {
                                    string dataType;


                                    //Set appropriate styling of each cell based on datatype
                                    //This depends on how sql server ends up reporting the datatype.
                                    switch (dt.Columns[i].DataType.ToString()) 
                                    {
                                        case "System.DateTime":

                                            dataType = "DateTime";

                                            break;
                                        case "System.Decimal":
                                        case "System.Double":
                                        case "System.Int16":
                                        case "System.Int32":
                                        case "System.Int64":
                                        case "System.Byte":
                                            dataType = "int";

                                            break;
                                        default:
                                            dataType = "varchar(100)";

                                            break;
                                    }
                                    sheetSql1 += "F" + i.ToString() + " " + dataType + ",";
                                    //sheetSql1 += dt.Columns[i].ColumnName + " varchar(50),";

                                }
                                sheetSql1 = sheetSql1.Remove(sheetSql1.Length - 1);
                                sheetSql1 += ")";
                                using (OleDbCommand cmd = new OleDbCommand(sheetSql1, conn))
                                {
                                    cmd.ExecuteNonQuery();
                                }
                                //}
                            }
                        }
                        // Write out row data
                        foreach (DataRow dr in dt.Rows)
                        {
                            string fields = "";
                            string values = "";
                            // now add records into the excel sheet just created
                            sheetSql1 = "INSERT INTO [" + data.DataSetName + "]";
                            for (int j = 0; j < maxcount; j++)
                            {
                                //fields += dt.Columns[j].ColumnName + ",";
                                //values += "@" + dt.Columns[j].ColumnName + ",";
                                fields += "F" + j.ToString() + ",";
                                values += "@F" + j.ToString() + ",";
                            }
                            fields = fields.Remove(fields.Length - 1);
                            values = values.Remove(values.Length - 1);
                            sheetSql1 += "(" + fields + ") VALUES(" + values + ")";
                            using (OleDbCommand cmd = new OleDbCommand(sheetSql1, conn))
                            {
                                for (int k = 0; k < maxcount; k++)
                                {

                                    string output;

                                    //Set appropriate styling of each cell based on datatype
                                    //This depends on how sql server ends up reporting the datatype.
                                    if (k < dt.Columns.Count)
                                    {
                                        switch (dt.Columns[k].DataType.ToString()) // FormatException murat data types
                                        {
                                            case "System.DateTime":
                                                try
                                                {

                                                    output = DateTime.Parse(dr[k].ToString()).ToString("dd/MM/yyyy");
                                                }
                                                catch (FormatException fe) //date is null or empty in dataset
                                                {
                                                    output = "";
                                                }

                                                break;
                                            case "System.Decimal":
                                            case "System.Double":
                                            case "System.Int16":
                                            case "System.Int32":
                                            case "System.Int64":
                                            case "System.Byte":

                                                output = dr[k].ToString().Trim();
                                                break;
                                            default:

                                                output = dr[k].ToString().Trim();
                                                break;
                                        }
                                    }
                                    else
                                        output = "0";
                                    //  cmd.Parameters.AddWithValue("@" + dt.Columns[k].ColumnName, dr[k]);

                                        cmd.Parameters.AddWithValue("@F" + k.ToString(), output);



                                }
                                cmd.ExecuteNonQuery();
                            }
                        }
                    }

                }

                conn.Close();
            }

i want to write sheets like this

来源:https://stackoverflow.com/questions/48706359/writing-multiple-tables-on-same-excel-sheet-with-oledb

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!