有时候需要处理大量的数据,且这些数据又存在于excel表格内,在平时的时候,我是非常喜欢这样的数据的,因为只要是excel表格内的数据,处理起来的方法就很方便。也可能我平时遇见的数据总是以一种杂乱无章的状态呈现出来,因此只要遇见存在于某个数据库内的数据,就满心地喜欢,瞬间就有很有条理的感觉,如下:如果要处理这么几堆数据,单凭一个excel数据操作用的不怎么地的程序员来说,要想从里面获取简单直观的数据,还是不太能一下子就弄出来的。
因此,只要是天天写程序的人,就会想各种满足自己懒惰心理的办法,来发挥计算机处理数据的巨大优势的,在这里用一个简单的winform,只需要拖入两个dataview控件,就能看见需要的数据,然后导出相应的类型
其实当把这个界面做完以后,我发现我的工作实在是多余,按照别人的要求,这里的需求只是按照下面的gridview报出机票类型分别为ET等的集中PNR就可以了,不过既然都画上了,再去掉不是就浪费了去掉的时间了么,于是简单的代码就像下面这样了。
//一共是两个按钮的单击事件,第一个是读取xls文件,下面的小代码添加了很多注释
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();//首先根据打开文件对话框,选择excel表格
ofd.Filter = "表格|*.xls";//打开文件对话框筛选器
string strPath;//文件完整的路径名
if (ofd.ShowDialog() == DialogResult.OK)
{
try
{
strPath = ofd.FileName;
string strCon = "provider=microsoft.jet.oledb.4.0;data source=" + strPath + ";extended properties=excel 8.0";
//关键是红色区域
OleDbConnection Con = new OleDbConnection(strCon);//建立连接 //绑定订单信息
string strSql = "select * from[Sheet1$]";//表名的写法也应注意不同,对应的excel表为sheet1,在这里要在其后加美元符号$,
并用中括号
OleDbCommand Cmd = new OleDbCommand(strSql, Con);//建立要执行的命令
OleDbDataAdapter da = new OleDbDataAdapter(Cmd);//建立数据适配器
DataSet ds = new DataSet();//新建数据集
da.Fill(ds, "Orders");//把数据适配器中的数据读到数据集中的一个表中(此处表名为Orders,可以任取表名)
//指定datagridview1的数据源为数据集ds的第一张表(也就是shyman表),也可以写ds.Table["Orders"]
dataGridView1.DataSource = ds.Tables[];//数据源的绑定 //绑定订单明细信息
string strSql1 = "select * from[Sheet2$]";
OleDbCommand Cmd1 = new OleDbCommand(strSql1, Con);//建立要执行的命令
OleDbDataAdapter da1 = new OleDbDataAdapter(Cmd1);//建立数据适配器
DataSet ds1 = new DataSet();//新建数据集
da1.Fill(ds1, "Details");//把数据适配器中的数据读到数据集中的一个表中(此处表名为Orders,可以任取表名)
dataGridView2.DataSource = ds1.Tables[];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);//捕捉异常
}
}
}
//这个按钮的单击事件是根据输入到类型框中的字符串获取当前列或者行的PNR之后导出到txt文件中。
private void ExportPNR_Click(object sender, EventArgs e)
{
string fileName = @"d:\"+Type.Text+".txt";
var PNRList = new List<string>(); //生成一个big endian Unicode编码格式的文本文件 StreamWriter sw = new StreamWriter(fileName, false, Encoding.GetEncoding("GB2312"));
//你可以试试其他编码,比如Encoding.GetEncoding("GB2312")或UTF8
sw.WriteLine();
sw.WriteLine("导出的PNR类型:"+Type.Text);
sw.WriteLine();
for (int i = ; i < ; i++)
{
//var PNR = "";
//sw.WriteLine(dataGridView2.Rows[i].Cells[1].Value.ToString());
//for (int j = 0; j < dataGridView2.Rows[i].Cells.Count-1; j++)
//{
// PNR += dataGridView2.Rows[i].Cells[j].Value.ToString() + " ";
//}
////写入订单记录
//sw.WriteLine(PNR);
//sw.WriteLine("订单明细---------------开始");
////写入订单详细记录
// for (int m = 0; m < dataGridView1.Rows.Count - 1; m++)
// if (dataGridView1.Rows[m].Cells[0].Value.ToString().Trim() ==
dataGridView2.Rows[i].Cells[1].Value.ToString().Trim())
// {
// var PNR_Details = "";
// for (int n = 0; n < dataGridView1.Rows[m].Cells.Count - 1; n++)
// {
// PNR_Details += dataGridView1.Rows[m].Cells[n].Value.ToString()+" ";
// }
// sw.WriteLine(PNR_Details);
// } // sw.WriteLine("订单明细---------------结束");
//代码注释的部分,是另外一种的txt文件中的显示方式。当然不是以某个类型的名字命名的txt文件。这一段代码就同时用到了两个gridview,一个是订单表,
一个是订单明细表,两者之间是一对多的关系,本来以为要导出两个表的关系来,后来发现并不需要,于是简单的导出一个表的按某个字段简单查询的某些字段而已。
for (int j = ; j < dataGridView1.Rows[i].Cells.Count-; j++)
{
if (dataGridView1.Rows[i].Cells[j].Value != null)
{
var PNR = dataGridView1.Rows[i].Cells[].Value.ToString();
if (PNR.Contains(Type.Text))
PNRList.Add(dataGridView1.Rows[i].Cells[].Value.ToString());
}
}
}
foreach (var item in PNRList.Distinct())
{
sw.WriteLine(" " + item);
} sw.Write("\r\n");
sw.Close();
MessageBox.Show("导出数据成功,PNR位于d:\a.txt文件下!");
}