C# ExcelReader,跳过第一行
我正在为ERP系统开发一个小插件,即从Excel文件读取数据,然后插入数据库(SQL)。由于当前工作表的som原因,将跳过第一行。我试图解决这个问题,当抛出SQL错误时,当我强制程序插入无效的内容时,该行将显示在SQL数据库中 谁能看出我做错了什么,因为我觉得我什么都试过了 客户类别C# ExcelReader,跳过第一行,c#,sql,excel,C#,Sql,Excel,我正在为ERP系统开发一个小插件,即从Excel文件读取数据,然后插入数据库(SQL)。由于当前工作表的som原因,将跳过第一行。我试图解决这个问题,当抛出SQL错误时,当我强制程序插入无效的内容时,该行将显示在SQL数据库中 谁能看出我做错了什么,因为我觉得我什么都试过了 客户类别 class Customer { public int ActNo {get;set;} public int CustNo { get; set; } public string Del
class Customer
{
public int ActNo {get;set;}
public int CustNo { get; set; }
public string DelPri { get; set; }
public int CustPrg3 = 22;
public string Nm { get; set; }
public int Gr6 = 5;
public int CreDt { get; set; }
public string CreUsr { get; set; }
public Customer(int ActNo,int CustNo, string DelPri, string Nm, int CreDt){
this.ActNo = ActNo;
this.CustNo = CustNo;
this.DelPri = DelPri;
this.CustPrg3 = 22;
this.Nm = Nm;
this.Gr6 = 5;
this.CreUsr = "Excel";
this.CreDt = CreDt;
}
}
读者
public class ExcelData
{
string _path;
public ExcelData(string path)
{
_path = path;
}
public IExcelDataReader getExcelReader()
{
// ExcelDataReader works with the binary Excel file, so it needs a FileStream
// to get started. This is how we avoid dependencies on ACE or Interop:
FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read);
// We return the interface, so that
IExcelDataReader reader = null;
try
{
if (_path.EndsWith(".xls"))
{
reader = ExcelReaderFactory.CreateBinaryReader(stream);
}
if (_path.EndsWith(".xlsx"))
{
reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
}
return reader;
}
catch (Exception)
{
throw;
}
}
public IEnumerable<string> getWorksheetNames()
{
var reader = this.getExcelReader();
var workbook = reader.AsDataSet();
var sheets = from DataTable sheet in workbook.Tables select sheet.TableName;
return sheets;
}
public IEnumerable<DataRow> GetSecondSheetData(bool firstRowIsColumnNames = true)
{
var reader = this.getExcelReader();
reader.IsFirstRowAsColumnNames = firstRowIsColumnNames;
return reader.AsDataSet().Tables[0].AsEnumerable();
}
}
公共类数据
{
字符串路径;
公共数据(字符串路径)
{
_路径=路径;
}
公共IExcelDataReader getExcelReader()
{
//ExcelDataReader使用二进制Excel文件,因此需要文件流
//开始。这就是我们避免依赖ACE或Interop的方法:
FileStream stream=File.Open(_path,FileMode.Open,FileAccess.Read);
//我们返回接口,以便
IExcelDataReader=null;
尝试
{
if(_path.EndsWith(“.xls”))
{
reader=ExcelReaderFactory.CreateBaryReader(流);
}
if(_path.EndsWith(“.xlsx”))
{
reader=ExcelReaderFactory.CreateOpenXmlReader(流);
}
返回读取器;
}
捕获(例外)
{
投掷;
}
}
公共IEnumerable getWorksheetNames()
{
var reader=this.getExcelReader();
var工作簿=reader.AsDataSet();
var sheets=来自工作簿中的数据表工作表。表选择sheet.TableName;
报税表;
}
public IEnumerable GetSecondSheetData(bool firstRowIsColumnNames=true)
{
var reader=this.getExcelReader();
reader.IsFirstRowAsColumnNames=firstRowIsColumnNames;
返回reader.AsDataSet().Tables[0].AsEnumerable();
}
}
使用读卡器并添加到客户阵列中
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
path = openFileDialog1.FileName;
int maxActNo = 0;
int maxCustNo = 0;
var excelData = new ExcelData(path);
var albums = excelData.GetSecondSheetData();
List<Customer> customers = new List<Customer>();
Customer testCust = new Customer(1, 1, "Test", "Test", Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd")));
customers.Add(testCust);
SqlDataReader rdr = cmd.ExecuteReader();
rdr.Read();
maxActNo = Convert.ToInt32(rdr["HighestActNo"]);
maxCustNo = Convert.ToInt32(rdr["HighestCustNo"]);
rdr.Close();
foreach (var row in albums)
{
if (row.ItemArray.Length == 8
&& row.ItemArray[0].ToString() != "Dato"
//&& row.ItemArray[0].ToString().Contains(convertedDate)
&& row.ItemArray[1].ToString() != "Varenummer"
&& row.ItemArray[2].ToString() != "Varenavn"
&& row.ItemArray[3].ToString() != "Kundekonto"
&& row.ItemArray[4].ToString() != "Navn"
&& row.ItemArray[5].ToString() != "Antall"
&& row.ItemArray[6].ToString() != "Antall"
&& row.ItemArray[7].ToString() != "Enhet"
//&& row.ItemArray[0].ToString() != ""
//&& row.ItemArray[1].ToString() != ""
//&& row.ItemArray[2].ToString() != ""
//&& row.ItemArray[3].ToString() != ""
//&& row.ItemArray[4].ToString() != ""
//&& row.ItemArray[5].ToString() != ""
//&& row.ItemArray[6].ToString() != ""
//&& row.ItemArray[7].ToString() != ""
)
{
Customer cust = new Customer(
maxActNo,
maxCustNo,
row[3].ToString(),
row[4].ToString(),
Convert.ToInt32(DateTime.Now.ToString("yyyyMMdd")));
if (customers[customers.Count() - 1].DelPri != row[3].ToString())
{
customers.Add(cust);
maxActNo++;
maxCustNo++;
}
}
}
customers.RemoveAt(0);
ImportController controller = new ImportController();
controller.insertCustomerIfNotExist(customers);
button2.Enabled = false;
}
}
if(openFileDialog1.ShowDialog()==DialogResult.OK)
{
path=openFileDialog1.FileName;
int maxActNo=0;
int-maxCustNo=0;
var excelData=新的excelData(路径);
var albums=excelData.GetSecondSheetData();
列出客户=新列表();
Customer testCust=新客户(1,1,“Test”,“Test”,Convert.ToInt32(DateTime.Now.ToString(“yyyyMMdd”));
customers.Add(testCust);
SqlDataReader rdr=cmd.ExecuteReader();
rdr.Read();
maxActNo=Convert.ToInt32(rdr[“HighestActNo]”);
maxCustNo=Convert.ToInt32(rdr[“HighestCustNo]”);
rdr.Close();
foreach(相册中的var行)
{
如果(row.ItemArray.Length==8
&&row.ItemArray[0]。ToString()!=“Dato”
//&&row.ItemArray[0].ToString()包含(convertedDate)
&&row.ItemArray[1].ToString()!=“Varenummer”
&&row.ItemArray[2].ToString()!=“Varenavn”
&&row.ItemArray[3].ToString()!=“Kundekonto”
&&row.ItemArray[4].ToString()!=“Navn”
&&row.ItemArray[5].ToString()!=“Antall”
&&row.ItemArray[6].ToString()!=“Antall”
&&row.ItemArray[7].ToString()!=“Enhet”
//&&row.ItemArray[0]。ToString()!=“”
//&&row.ItemArray[1]。ToString()!=“”
//&&row.ItemArray[2]。ToString()!=“”
//&&row.ItemArray[3]。ToString()!=“”
//&&row.ItemArray[4]。ToString()!=“”
//&&row.ItemArray[5]。ToString()!=“”
//&&row.ItemArray[6]。ToString()!=“”
//&&row.ItemArray[7]。ToString()!=“”
)
{
客户客户=新客户(
maxActNo,
马克斯库斯诺,
第[3]行。ToString(),
第[4]行。ToString(),
转换.ToInt32(DateTime.Now.ToString(“yyyyMMdd”);
if(customers[customers.Count()-1].DelPri!=行[3].ToString())
{
添加(cust);
maxActNo++;
maxCustNo++;
}
}
}
客户。RemoveAt(0);
ImportController=新的ImportController();
controller.insertCustomerIfNotExist(客户);
按钮2.Enabled=false;
}
}
我选择不显示SQL,因为我知道probleb不在查询中,而是在if语句中的某个地方对行进行排序,但我已经尝试了几个小时,并认为我需要一个提示
感谢您的建议如果有人看到这一点,我会找出我的代码运行不符合预期的原因。 上面的代码中没有错误,我对从索引1而不是索引0开始的插入循环视而不见 结束这个问题,但感谢所有阅读或试图回答的人
for (int i = 1; i < customers.Count; i++)
for(int i=1;i
需要
for (int i = 0; i < customers.Count; i++)
for(int i=0;i
在插入函数中。对于任何看到这一点的人,我都明白了为什么