最近在自己做一个小型对账系统,包括支付宝,微信,银联三个内容,因为支付宝当面付账单提供的接口是提供下载链接,然后下载一个压缩包,技术还没有那么高超,用代码解压,思路是:
1.通过接口,获取账单下载链接,通过下面代码访问网页,然后进行下载文件。
System.Diagnostics.Process.Start(url);
2.打开本地窗口,获取文件路径
string Route; //路径
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Multiselect = true;
fileDialog.Title = "请选择文件";
fileDialog.Filter = "所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
Route = fileDialog.FileName;
try
{
zfb_dt = re.OpenCSVFile(Route);
dgv1.DataSource = zfb_dt;
label5.Text = "支付宝";
mode.zfb_dt = zfb_dt;
}
catch (Exception ex)
{
MessageBox.Show("选择文件格式不规范,请选择“业务明细”文件!");
}
}
else
{
MessageBox.Show("未选择文件");
}
ps:因为支付宝账单有两个文件,分别是:业务明细和业务明细(汇总),两个文件的Csv格式是不同的。
3.通过文件路径,解析Csv文件,转化为dataTabel
Csv文件格式:
代码如下
public DataTable OpenCSVFile(string filepath)
{
DataTable zfb_dt = new DataTable();
bool blnFlag = true;
DataColumn dc;
DataRow dr;
string[] aryline;
StreamReader mysr = new StreamReader(filepath, System.Text.Encoding.Default);
string strline;
int a = 0;
while ((strline = mysr.ReadLine()) != null)
{
aryline = strline.Split(new char[] { ',' });
int intColCount = aryline.Length;
if (intColCount > 1)//列数超过1
{
//给datatable加上列名
if (blnFlag)
{
blnFlag = false;
for (int i = 0; i < intColCount; i++)
{
dc = new DataColumn(aryline[i].ToString());
zfb_dt.Columns.Add(dc);
}
}
//捞出Csv文件的列标题,但是在内容中不显示
if (a == 1)
{
//填充数据并加入到datatable中
dr = zfb_dt.NewRow();
for (int i = 0; i < intColCount; i++)
{
dr[i] = aryline[i];
}
zfb_dt.Rows.Add(dr);
}
a = 1;
}
}
//只显示datatable其中需要的几列字段
DataTable dt = zfb_dt.DefaultView.ToTable(false, new string[] { "商户订单号", "商品名称", "业务类型", "商家实收(元)", "完成时间" });
return dt;
}
总结:主要就是将csv中的数据转化为特定编码的字符。然后每次读取一行,并找出想要的行,进行处理,循环保存为dataTable中的行。
如果大家有更好的方法,希望可以在评论中留下,相互学习,谢谢。
如果此博客对你有帮助或者还有什么疑问,大家都可以在评论中一起讨论,谢谢。