【发布时间】:2014-03-26 13:09:06
【问题描述】:
背景故事
我正在为我们的工程师制作一个表格,旨在“自动化”我们的物料清单生成。我们有一个与 AutoCAD 一起使用的名为 AutoAttibute(由 Cadig 开发)的程序,它获取每个选定“块”的值并将其输出到 excel 文件。没有选项可以将其输出为任何其他格式(SQL、Access 等)。
AutoAttribute 生成的表格的基本布局如下:
Material | Total Length Weight
--------------------------------
name1 | 34
name1 | 34
name2 | 34
name2 | 34
name3 | 34
name3 | 34
name4 | 33
name4 | 33
name5 | 1254
name6 | 324
还生成了其他列,但这些是我需要关注的。
创建此文件后,我们一直在使用 MS Access 获取第二列中值的总和。
这是查询:
我没有我们使用的确切查询,但基本上是:
Select Distinct [Material],
[Total Length Weight]
from `table`
where [Material] <> ''
这给了我:
Material | Total Length Weight
--------------------------------
name1 | 34
name2 | 34
name3 | 34
name4 | 33
name5 | 1254
name6 | 324
然后,在一个单独的查询中:
Select Sum [Total Length Weight]
From Query 1
这给了我:
Sum([Total Length Weight])
----------------------------
1713
然后我们可以使用该值来做其他事情,例如在另一个显示项目总权重的公式中用作变量。
新问题
我现在正在使用 C# 创建一个全新的表单,但我在重新创建查询时遇到了问题。
我正在使用连接字符串:
string file = "D:\\Cut-Lengths\\13-1311 CUT-LENGTHS.xlsx";
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=Excel 12.0";
然后,我有以下查询:
string query = "Select Sum([CUT-LENGTH-WEIGHT]) AS [SumOfCUT-LENGTH-WEIGHT], Sum([TOTAL-SHEETING-WEIGHT]) AS [SumOfTOTAL-SHEETING-WEIGHT], Sum([TOTAL-ITEM-WEIGHT]) AS [SumOfTOTAL-ITEM-WEIGHT] From [Sheet1$]";
string query2 = "Select COUNT([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]";
string query3 = "Select DISTINCT [Total-Length-Weight] AS `Total Length Weight`, [Material] AS `Material`, [Order] From [Sheet1$] WHERE [Material] <> '' ORDER BY [Order]";
string table = "Select * From [Sheet1$]";
我使用这些查询来填充 4 个 dataGridView,以及表单上的几个 TextBox。
query2 非常错误,我知道。这就是我尝试从 Access 重新创建查询的地方,但无论我尝试什么,我都无法让它工作。
我尝试过的相同查询的其他方式:
string query2 = "Select Sum(DISTINCT [Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]";
string query2 = "Select DISTINCT [material], Sum([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]";
还有一些我现在不记得了。我知道其中一个涉及到一个从未加载过表单的子查询。
我真的需要帮助,我只是不知道自己做错了什么。
完整格式代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Xml.Serialization;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
namespace excelConnectiontests
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void SetFirstRowSelected()
{
if (gvExcelData.Rows.Count > 0)
{
var row = gvExcelData.Rows[0];
var row2 = gvExcelData2.Rows[0];
var row3 = gvExcelData3.Rows[0];
var row4 = gvExcelData4.Rows[0];
txtCutLengthWeight.Text = row.Cells[0].Value.ToString();
txtTotalSheetingWeight.Text = row.Cells[1].Value.ToString();
txtTotalItemWeight.Text = row.Cells[2].Value.ToString();
//and so on
int value1 = Convert.ToInt32(row.Cells[0].Value);
int value2 = Convert.ToInt32(row.Cells[1].Value);
int value3 = Convert.ToInt32(row.Cells[2].Value);
int value4 = 0;
if (txtCutSheetingWeight.Text != "")
{
value4 = Convert.ToInt32(txtCutSheetingWeight.Text);
}
else
{
value4 = 0;
}
txtNetWeight.Text = (value1 + value2 + value3 + value4).ToString();
gvExcelData.CurrentCell = row.Cells[0]; //set focus to first cell in first row
}
}
private void Form1_Load(object sender, EventArgs e)
{
string file = "D:\\Cut-Lengths\\13-1311 CUT-LENGTHS.xlsx";
string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties=Excel 12.0";
string CutTubes = "";
string CutSheeting = "";
string UncutTubes = "";
string UncutSheeting = "";
string NonSteel = "";
string p31 = "";
string query = "Select Sum([CUT-LENGTH-WEIGHT]) AS [SumOfCUT-LENGTH-WEIGHT], Sum([TOTAL-SHEETING-WEIGHT]) AS [SumOfTOTAL-SHEETING-WEIGHT], Sum([TOTAL-ITEM-WEIGHT]) AS [SumOfTOTAL-ITEM-WEIGHT] From [Sheet1$]";
string query2 = "Select COUNT([Total-Length-Weight]) AS `Total Length Weight` From [Sheet1$]";
string query3 = "Select DISTINCT [Total-Length-Weight] AS `Total Length Weight`, [Material] AS `Material`, [Order] From [Sheet1$] WHERE [Material] <> '' ORDER BY [Order]";
string table = "Select * From [Sheet1$]";
OleDbConnection connObj = new OleDbConnection(connString);
connObj.Open();
// Uncut Steel
OleDbCommand cmdObj4 = new OleDbCommand(query3, connObj);
OleDbDataAdapter daObj4 = new OleDbDataAdapter(cmdObj4);
DataTable dtObj4 = new DataTable();
daObj4.Fill(dtObj4);
gvExcelData4.DataSource = dtObj4;
// Totals
OleDbCommand cmdObj3 = new OleDbCommand(table, connObj);
OleDbDataAdapter daObj3 = new OleDbDataAdapter(cmdObj3);
DataTable dtObj3 = new DataTable();
daObj3.Fill(dtObj3);
gvExcelData3.DataSource = dtObj3;
// Length Weight
OleDbCommand cmdObj = new OleDbCommand(query, connObj);
OleDbDataAdapter daObj = new OleDbDataAdapter(cmdObj);
DataTable dtObj = new DataTable();
daObj.Fill(dtObj);
gvExcelData.DataSource = dtObj;
// Total Length Weight
OleDbCommand cmdObj2 = new OleDbCommand(query2, connObj);
OleDbDataAdapter daObj2 = new OleDbDataAdapter(cmdObj2);
DataTable dtObj2 = new DataTable();
daObj2.Fill(dtObj2);
gvExcelData2.DataSource = dtObj2;
connObj.Close();
SetFirstRowSelected();
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
SetFirstRowSelected();
}
}
}
解决方案
我找到了我需要的东西:
string query2 = "SELECT SUM([Total-Length-Weight]) FROM (Select DISTINCT [Material], [Total-Length-Weight] from [Sheet1$])";
感谢大家的帮助。
【问题讨论】: