读取指定文件夹中所有CSV文件,并解析内容
1.先引入Aspose.Cells.dll,我觉得这个很好用,基本关于EXCEL的我都使用这个处理。
2.读取文件夹中所有文件的文件名与创建时间,txtFilePath用于自定义文件夹,richTextBox1用于
画面展示,txtDB自由输入数据库DB。
             List <string> sqlInsertList = new List<string>();
DirectoryInfo dirInfo = new DirectoryInfo(txtFilePath.Text.Trim()); //HK
FileInfo[] files = dirInfo.GetFiles(); // 获取目录中的所有文件信息
foreach (FileInfo file in files)
{
if (file.Extension.ToString().Contains("csv"))
string strFilePath = txtFilePath.Text+"\\" + file.Name;
richTextBox1.Text += strFilePath + "\r\n";
strFilePath = strFilePath.Replace("\\", "\\\\");
if (txtDB.Text.Trim().ToLower() == "数据库db")//因为我这里有不同的数据库要使用
{
sqlInsertList.Add("insert INTO  apps.pcp_file_log(file_path, File_name, file_date, create_date, status) values('" + strFilePath.Replace("'", "") + "','" + file.Name.Replace("'", "") + "',to_date('" + file.CreationTime.ToString() + "','yyyy-MM-dd HH24:MI:SS'),sysdate,'0')");
                    }
else
{
sqlInsertList.Add("insert INTO  apps.pcp_file_log_sg(file_path, File_name, file_date, create_date, status) values('" + strFilePath.Replace("'", "") + "','" + file.Name.Replace("'", "") + "',to_date('" + file.CreationTime.ToString() + "','yyyy-MM-dd HH24:MI:SS'),sysdate,'0')");
}
}
FunctionClass fun = new FunctionClass();
fun.ExecuteOracleTransaction(txtDB.Text.Trim(), sqlInsertList, false);
sqlInsertList.Clear();
//Console.WriteLine(file.Name); // 输出文件名
//Console.WriteLine(file.FullName); // 输出文件完整路径
//Console.WriteLine(file.Length); // 输出文件大小(字节)
//Console.WriteLine(); // 输出空行,以便区分不同文件的信息
}
3.解析文件夹中所有的CSV文件。
DataTable dt = FunctionClass.ExecuteReader("select * from apps.pcp_file_log_sg where status='0'", txtDB.Text.Trim());
if (dt != null)
{
if (dt.Rows.Count > 0)
{
// 创建工作簿对象并加载CSV文件
for (int i = 0; i < dt.Rows.Count; i++)
{
string strPath = this.txtFilePath.Text+"\\" + dt.Rows[i]["file_name"].ToString();
if (File.Exists(strPath))
{
var workbook = new Workbook(strPath);
// 获取第一个工作表
Worksheet worksheet = workbook.Worksheets[0];
                            string strInvoNo = worksheet.Cells[0, 1].StringValue.ToString();
string strInvoiceDate = worksheet.Cells[1, 1].StringValue.ToString();
string strBillTo = worksheet.Cells[2, 1].StringValue.ToString().Replace(",", "");
string strBillFrom = worksheet.Cells[3, 1].StringValue.ToString().Replace(",", ""); ;
string strTotalAmount = worksheet.Cells[4, 1].StringValue.ToString();
string strCurrency = worksheet.Cells[5, 1].StringValue.ToString();
// 读取并输出单元格数据
for (int row = 7; row <= worksheet.Cells.MaxRow; row++)
{
                                // 输出单元格的值,处理可能的null值
if (txtDB.Text.Trim().ToLower() == "数据库DB")
{
sqlInsertList.Add("insert INTO apps.pcp_inv_csv (inv_no,inv_date,bil_to,bill_from,total_amount,cur,po_no,pn1,pn2,qty,unit_price,line_amount,file_name) values ('" + strInvoNo + "','" + strInvoiceDate + "','" + strBillTo + "','" + strBillFrom + "','" + strTotalAmount + "','" + strCurrency + "','" + worksheet.Cells[row, 0].StringValue.ToString() + "','" + worksheet.Cells[row, 1].StringValue.ToString() + "','" + worksheet.Cells[row, 2].StringValue.ToString() + "','" + worksheet.Cells[row, 3].StringValue.ToString() + "','" + worksheet.Cells[row, 4].StringValue.ToString() + "','" + worksheet.Cells[row, 5].StringValue.ToString() + "','" + dt.Rows[i]["File_name"].ToString() + "')");
}
else
{
sqlInsertList.Add("insert INTO apps.pcp_inv_csv_sg (inv_no,inv_date,bil_to,bill_from,total_amount,cur,po_no,pn1,pn2,qty,unit_price,line_amount,file_name) values ('" + strInvoNo + "','" + strInvoiceDate + "','" + strBillTo + "','" + strBillFrom + "','" + strTotalAmount + "','" + strCurrency + "','" + worksheet.Cells[row, 0].StringValue.ToString() + "','" + worksheet.Cells[row, 1].StringValue.ToString() + "','" + worksheet.Cells[row, 2].StringValue.ToString() + "','" + worksheet.Cells[row, 3].StringValue.ToString() + "','" + worksheet.Cells[row, 4].StringValue.ToString() + "','" + worksheet.Cells[row, 5].StringValue.ToString() + "','" + dt.Rows[i]["File_name"].ToString() + "')");
}
                            }
FunctionClass fun = new FunctionClass();
fun.ExecuteOracleTransaction(txtDB.Text.Trim(), sqlInsertList, false);
sqlInsertList.Clear();
}
}
}
}
4.函数
(1) ExecuteOracleTransaction
        /// <summary>
/// ExecuteTransaction执行一组SQL语句
/// </summary>
/// <param name="sqlList">要执行的SQL语句集合 </param>
/// <param name="earlyTermination">事务中有数据不满足要求是否提前终止事务</param>
/// <returns></returns>
//DBList(strDbName)是根据strDbName取数据库连接字符串此处就省略了。
// 格式为:Host=192.1*6.1.0;Port=1521;User ID=W**;Password=****;SID=DBName
//DDTek.Oracle这个引用了DDTek.Oracle.dll也可以使用自己的方法哈,我这个为了不安装
// 客户端 配置,引用了这个。
public bool ExecuteOracleTransaction(string strDbName, List<string> sqlList, bool              earlyTermination)
{
//创建数据库连接对象
DDTek.Oracle.OracleConnection con = new OracleConnection(DBList(strDbName));
if (con.State != ConnectionState.Open)
con.Open();
            using (DDTek.Oracle.OracleTransaction transaction = con.BeginTransaction())
{
using (DDTek.Oracle.OracleCommand command = con.CreateCommand())
{
command.Transaction = transaction;  //为命令指定事务
try
{
bool mark = true;//标记值,记录是否有操作失败的
foreach (string strItemSql in sqlList)
{
command.CommandText = strItemSql;
if (earlyTermination)
{
if (command.ExecuteNonQuery() <= 0)
{
mark = false;
break;
}
}
else
{
command.ExecuteNonQuery();
}
}
                        if (!mark)//如果有某一条执行失败,就回滚
{
transaction.Rollback(); //事务回滚
return false;
}
else
{
transaction.Commit();   //事务提交
command.Parameters.Clear();
if (command.Transaction != null)
{
command.Transaction = null;
}
con.Close();
return true;
}
}
catch (Exception e)
{
con.Close();
transaction.Rollback(); //事务回滚
                        throw e;
}
                }
}
}
(2) 函数ExecuteReader
       /// <summary>
/// 返回数据TABLE
/// </summary>
/// <param name="cmdText">SELECT SQL语句</param>
/// <param name="strDbType">数据库名</param>
/// <returns></returns>
 public static DataTable ExecuteReader(string cmdText,string strDbType)
{
            DataTable dt = new DataTable();
try
{
string strConnection = DBList(strDbType);
DDTek.Oracle.OracleCommand cmd = new DDTek.Oracle.OracleCommand();
//创建数据库连接对象
DDTek.Oracle.OracleConnection conn = new OracleConnection(strConnection);
if (conn.State != ConnectionState.Open)
conn.Open();
                cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = CommandType.Text;
DDTek.Oracle.OracleDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
if (rdr.HasRows)
{
dt.Load(rdr);
}
else
{
dt = null;
}
rdr.Close();
}
catch (Exception ee)
{
                dt = null;
}
return dt;
}
CSV格式:

