将三个表中的数据批量导出为一个 Excel Sheet
Bulk Export Data From Three Tables Into One Excel Sheet
我工作的公司要求定期将库存导出到 excel sheet。值得庆幸的是,它总共不到 50k 个项目,但根据我目前的导出方式,它花费了荒谬的时间。这些项目分为三个不同的 table,但我认为我的问题来自必须为每个项目打开多个连接以获取信息,例如将 brandID 转换为 brandName,或将 locationID 转换为 locationName。
请注意,所有代码都是用 c# 编写的。
这是我用来开始导出的当前方法:
public void exportAllItems()
{
exportTable = new System.Data.DataTable();
exportTable.Columns.Add("Vendor", typeof(string));
exportTable.Columns.Add("Store_ID", typeof(string));
exportTable.Columns.Add("ItemNumber", typeof(string));
exportTable.Columns.Add("Shipment_Date", typeof(string));
exportTable.Columns.Add("Brand", typeof(string));
exportTable.Columns.Add("Model", typeof(string));
exportTable.Columns.Add("Club_Type", typeof(string));
exportTable.Columns.Add("Shaft", typeof(string));
exportTable.Columns.Add("Number_of_Clubs", typeof(string));
exportTable.Columns.Add("Tradein_Price", typeof(double));
exportTable.Columns.Add("Premium", typeof(double));
exportTable.Columns.Add("WE PAY", typeof(double));
exportTable.Columns.Add("QUANTITY", typeof(int));
exportTable.Columns.Add("Ext'd Price", typeof(double));
exportTable.Columns.Add("RetailPrice", typeof(double));
exportTable.Columns.Add("Comments", typeof(string));
exportTable.Columns.Add("Image", typeof(string));
exportTable.Columns.Add("Club_Spec", typeof(string));
exportTable.Columns.Add("Shaft_Spec", typeof(string));
exportTable.Columns.Add("Shaft_Flex", typeof(string));
exportTable.Columns.Add("Dexterity", typeof(string));
exportTable.Columns.Add("Destination", typeof(string));
exportTable.Columns.Add("Received", typeof(string));
exportTable.Columns.Add("Paid", typeof(string));
exportAllAdd_Clubs();
exportAllAdd_Accessories();
exportAllAdd_Clothing();
DataColumnCollection dcCollection = exportTable.Columns;
// Export Data into EXCEL Sheet
Application ExcelApp = new Application();
ExcelApp.Application.Workbooks.Add(Type.Missing);
for (int i = 1; i < exportTable.Rows.Count + 2; i++)
{
for (int j = 1; j < exportTable.Columns.Count + 1; j++)
{
if (i == 1)
{
ExcelApp.Cells[i, j] = dcCollection[j - 1].ToString();
}
else
ExcelApp.Cells[i, j] = exportTable.Rows[i - 2][j -
1].ToString();
}
}
//Get users profile, downloads folder path, and save to workstation
string pathUser =
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
string pathDownload = Path.Combine(pathUser, "Downloads");
ExcelApp.ActiveWorkbook.SaveCopyAs(pathDownload + "\TotalInventory-
" + DateTime.Now.ToString("d MMM yyyy") + ".xlsx");
ExcelApp.ActiveWorkbook.Saved = true;
ExcelApp.Quit();
}
由于公司要求,excelsheet需要有header,和上面创建的datatable一样的信息。在创建 exportTable 之后,我调用了三个其他方法来遍历每个项目 table。我将只展示其中一个,因为它们大部分相同:
//Puts the clubs in the export table
public void exportAllAdd_Clubs()
{
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "Select * from tbl_clubs";
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
exportTable.Rows.Add("",
(lm.locationName(Convert.ToInt32(reader["locationID"]))).ToString(),
(Convert.ToInt32(reader["sku"])).ToString(),
"", idu.brandType(Convert.ToInt32(reader["brandID"])),
idu.modelType(Convert.ToInt32(reader["brandID"])),
reader["clubType"].ToString(),
reader["shaft"].ToString(),
reader["numberOfClubs"].ToString(), 0, Convert.ToDouble(reader["premium"]),
Convert.ToDouble(reader["cost"]),
Convert.ToInt32(reader["quantity"]), 0,
Convert.ToDouble(reader["price"]), reader["comments"].ToString(), "",
reader["clubSpec"].ToString(),
reader["shaftSpec"].ToString(),
reader["shaftFlex"].ToString(), reader["dexterity"].ToString(), "", "", "");
}
conn.Close();
}
在上述方法中,我必须调用三个不同的方法来将数据转换为有意义的字符串。一个用于品牌、型号和位置。
我乐于接受有关如何加快速度或正确进行批量导出的各种想法。
感谢您的宝贵时间!
更新
在弄乱了 EPPlus 之后,我的导出时间仍然太长。我认为这与我如何遍历数据库中的每一行并一次导出它们有关。仍在努力寻找一种不同的方法。
我知道问题出在哪里了:
我不是用一个带有子查询的巨大查询,而是对每个项目执行多个查询,这占用了太多时间。在记住我可以执行子查询并实施更改后,导出时间从 30 多分钟减少到不到 5 秒。
我工作的公司要求定期将库存导出到 excel sheet。值得庆幸的是,它总共不到 50k 个项目,但根据我目前的导出方式,它花费了荒谬的时间。这些项目分为三个不同的 table,但我认为我的问题来自必须为每个项目打开多个连接以获取信息,例如将 brandID 转换为 brandName,或将 locationID 转换为 locationName。
请注意,所有代码都是用 c# 编写的。 这是我用来开始导出的当前方法:
public void exportAllItems()
{
exportTable = new System.Data.DataTable();
exportTable.Columns.Add("Vendor", typeof(string));
exportTable.Columns.Add("Store_ID", typeof(string));
exportTable.Columns.Add("ItemNumber", typeof(string));
exportTable.Columns.Add("Shipment_Date", typeof(string));
exportTable.Columns.Add("Brand", typeof(string));
exportTable.Columns.Add("Model", typeof(string));
exportTable.Columns.Add("Club_Type", typeof(string));
exportTable.Columns.Add("Shaft", typeof(string));
exportTable.Columns.Add("Number_of_Clubs", typeof(string));
exportTable.Columns.Add("Tradein_Price", typeof(double));
exportTable.Columns.Add("Premium", typeof(double));
exportTable.Columns.Add("WE PAY", typeof(double));
exportTable.Columns.Add("QUANTITY", typeof(int));
exportTable.Columns.Add("Ext'd Price", typeof(double));
exportTable.Columns.Add("RetailPrice", typeof(double));
exportTable.Columns.Add("Comments", typeof(string));
exportTable.Columns.Add("Image", typeof(string));
exportTable.Columns.Add("Club_Spec", typeof(string));
exportTable.Columns.Add("Shaft_Spec", typeof(string));
exportTable.Columns.Add("Shaft_Flex", typeof(string));
exportTable.Columns.Add("Dexterity", typeof(string));
exportTable.Columns.Add("Destination", typeof(string));
exportTable.Columns.Add("Received", typeof(string));
exportTable.Columns.Add("Paid", typeof(string));
exportAllAdd_Clubs();
exportAllAdd_Accessories();
exportAllAdd_Clothing();
DataColumnCollection dcCollection = exportTable.Columns;
// Export Data into EXCEL Sheet
Application ExcelApp = new Application();
ExcelApp.Application.Workbooks.Add(Type.Missing);
for (int i = 1; i < exportTable.Rows.Count + 2; i++)
{
for (int j = 1; j < exportTable.Columns.Count + 1; j++)
{
if (i == 1)
{
ExcelApp.Cells[i, j] = dcCollection[j - 1].ToString();
}
else
ExcelApp.Cells[i, j] = exportTable.Rows[i - 2][j -
1].ToString();
}
}
//Get users profile, downloads folder path, and save to workstation
string pathUser =
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
string pathDownload = Path.Combine(pathUser, "Downloads");
ExcelApp.ActiveWorkbook.SaveCopyAs(pathDownload + "\TotalInventory-
" + DateTime.Now.ToString("d MMM yyyy") + ".xlsx");
ExcelApp.ActiveWorkbook.Saved = true;
ExcelApp.Quit();
}
由于公司要求,excelsheet需要有header,和上面创建的datatable一样的信息。在创建 exportTable 之后,我调用了三个其他方法来遍历每个项目 table。我将只展示其中一个,因为它们大部分相同:
//Puts the clubs in the export table
public void exportAllAdd_Clubs()
{
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "Select * from tbl_clubs";
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
exportTable.Rows.Add("",
(lm.locationName(Convert.ToInt32(reader["locationID"]))).ToString(),
(Convert.ToInt32(reader["sku"])).ToString(),
"", idu.brandType(Convert.ToInt32(reader["brandID"])),
idu.modelType(Convert.ToInt32(reader["brandID"])),
reader["clubType"].ToString(),
reader["shaft"].ToString(),
reader["numberOfClubs"].ToString(), 0, Convert.ToDouble(reader["premium"]),
Convert.ToDouble(reader["cost"]),
Convert.ToInt32(reader["quantity"]), 0,
Convert.ToDouble(reader["price"]), reader["comments"].ToString(), "",
reader["clubSpec"].ToString(),
reader["shaftSpec"].ToString(),
reader["shaftFlex"].ToString(), reader["dexterity"].ToString(), "", "", "");
}
conn.Close();
}
在上述方法中,我必须调用三个不同的方法来将数据转换为有意义的字符串。一个用于品牌、型号和位置。
我乐于接受有关如何加快速度或正确进行批量导出的各种想法。
感谢您的宝贵时间!
更新
在弄乱了 EPPlus 之后,我的导出时间仍然太长。我认为这与我如何遍历数据库中的每一行并一次导出它们有关。仍在努力寻找一种不同的方法。
我知道问题出在哪里了:
我不是用一个带有子查询的巨大查询,而是对每个项目执行多个查询,这占用了太多时间。在记住我可以执行子查询并实施更改后,导出时间从 30 多分钟减少到不到 5 秒。