我正在遍历数据库并按月查询,然后将这些数据插入到DataTable
每个用户指定年份的月份。我想将此DataTable
插入到Excel工作簿的新工作表中。因此,在我的单个Excel工作簿中,我最终会得到12张。
所以我有几个问题源于此。
让DataSet包含我的12个DataTables(每个月一个)会更好吗?然后是否有一种快速简便的方法从我的DataSet创建Excel电子表格,并且该集合中有12个DataTable,它会为每个DataTable创建一个单独的工作表?
然后另一个问题是
创建12个不同的DataTable并为工作簿中的每个DataTable创建工作簿和单独的工作表并逐个从DataTable填充该工作表是否更简单或更容易?
答案 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正是我所需要的。