将DataTable / DataSet写入Excel工作簿

时间:2015-11-13 17:49:28

标签: c# excel datatable dataset

我正在遍历数据库并按月查询,然后将这些数据插入到DataTable每个用户指定年份的月份。我想将此DataTable插入到Excel工作簿的新工作表中。因此,在我的单个Excel工作簿中,我最终会得到12张。

所以我有几个问题源于此。

  

让DataSet包含我的12个DataTables(每个月一个)会更好吗?然后是否有一种快速简便的方法从我的DataSet创建Excel电子表格,并且该集合中有12个DataTable,它会为每个DataTable创建一个单独的工作表?

然后另一个问题是

  

创建12个不同的DataTable并为工作簿中的每个DataTable创建工作簿和单独的工作表并逐个从DataTable填充该工作表是否更简单或更容易?

2 个答案:

答案 0 :(得分:0)

您可以将所有数据放入一个DataTable中,查询不同月份,然后遍历数据行,创建工作表并插入数据。下面的示例使用放入DataTable中的模拟数据来完成此操作。有两个sql语句,一个用于创建工作表,另一个用于插入数据。完成后,对于此示例,将有一个三个月的工作表,而不是12个,除非每月至少有一个或更多的记录。如果你不得不回来并插入更多的行,那么就需要额外的逻辑,但是我们需要首先看看是否存在可以完成的工作表,只需尝试创建现有工作表就会抛出异常。我把这个例子很简单。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo1_CS
{
    public class MonthDemo
    {
        /// <summary>
        /// Let's look at this as data coming back from a database table
        /// </summary>
        /// <returns></returns>
        public DataTable Table()
        {
            DataTable dt = new DataTable();

            dt.Columns.Add(new DataColumn()
            {
                ColumnName = "ID",
                DataType = typeof(int),
                AutoIncrement = true
            });
            dt.Columns.Add(new DataColumn()
            {
                ColumnName = "Month",
                DataType = typeof(string)
            });
            dt.Columns.Add(new DataColumn()
            {
                ColumnName = "Name",
                DataType = typeof(string)
            });

            dt.Rows.Add(new object[] { null, "January", "Karen Payne" });
            dt.Rows.Add(new object[] { null, "January", "Bill Smith" });
            dt.Rows.Add(new object[] { null, "March", "George Jones" });
            dt.Rows.Add(new object[] { null, "April", "Frank White" });

            return dt;

        }
        /// <summary>
        /// Get a list of distinct month names
        /// </summary>
        /// <returns></returns>
        public List<string> MonthNames()
        {
            return Table()
                .AsEnumerable()
                .Select(row => row.Field<string>("Month"))
                .Distinct()
                .ToList();
        }
        public void Work()
        {
            // SQL responsible for creating sheets
            string createCommandText =
                        @"
                            CREATE TABLE {0}
                            (
                                ID INT,
                                Name CHAR(255)
                            )";

            // SQL responsible for inserting rows of data
            string insertCommandText = @"
                        INSERT INTO {0}
                        (
                            ID,
                            Name
                        )
                        VALUES
                        (
                            @ID,
                            @Name
                        )
                    ";

            // assumes this file exists
            string FileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "DemoMonths.xlsx");

            List<DataRow> result;

            using (OleDbConnection cn = new OleDbConnection { ConnectionString = "TODO"})
            {
                using (OleDbCommand cmd = new OleDbCommand { Connection = cn })
                {
                    cmd.Parameters.Add(new OleDbParameter() { ParameterName = "@ID", DbType = DbType.Int32 });
                    cmd.Parameters.Add(new OleDbParameter() { ParameterName = "@MonthName", DbType = DbType.String });
                    cmd.Parameters.Add(new OleDbParameter() { ParameterName = "@Name", DbType = DbType.String });

                    // assume the file will open else use a try-catch
                    cn.Open();

                    // Iterate months, get rows and insert rows into proper sheet
                    foreach (string monthName in MonthNames())
                    {
                        result = Table().AsEnumerable().Where(row => row.Field<string>("Month") == monthName).ToList();
                        if (result.Count > 0)
                        {
                            foreach (DataRow row in result)
                            {
                                // assumes sheet does not exists, create it
                                cmd.CommandText = string.Format(createCommandText, monthName);

                                try
                                {
                                    // test if create sheet worked
                                    if (cmd.ExecuteNonQuery() == 1)
                                    {

                                        // load values into command object parameters
                                        cmd.CommandText = string.Format(insertCommandText, monthName);
                                        cmd.Parameters["@ID"].Value = row.Field<int>("ID");
                                        cmd.Parameters["@Name"].Value = row.Field<string>("Name");

                                        // insert row data
                                        cmd.ExecuteNonQuery();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    // simply an example, best to say write to a log file
                                    Console.WriteLine("Failed to create or insert: {0}", ex.Message);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

This正是我所需要的。