【前言】
还是前两天做那个抽奖系统, 因为抽完奖要保存到Excel表格里所以用到了导出功能。 之前写过一篇用WPS导出的,但是那种导出方法效率太低,经常点击导出以后还要等它转两圈。所以就有了这篇博客。 PS:我们抽奖系统的最终界面和上一版有不小的变化。
亮哥给我们的系统还提了些思想,应该建立一个后台,配置都在后台,页面就留一个按钮就好。 感觉设计的境界确实有差距。
【正文】
下面我们来看高效导出具体如何实现的。 主要思想是通过流把dataset里的数据都放到流里,然后通过流一次性输出成文件。这样就不用多次和Excel交互。从而减少时间。
public void DataSetExportToExcel(DataGridView dgv, string strTitle)
{
//System.DateTime currentTime = new DateTime();
String currentTime = System.DateTime.Now.ToString("yyyy年M月d日HHmmss");
SaveFileDialog saveFileDialog = new SaveFileDialog();//实例化一个SaveFileDialog保存文件对话框
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";//设置文件类型
saveFileDialog.FilterIndex = 1; //设置默认文件类型显示顺序
//saveFileDialog.RestoreDirectory = true;//设为true时,对话框选择的目录会重新回到关闭此对话框时候的当前目录,就是点保存后,对话选择的默认目录为上次关闭时的目录
//saveFileDialog.CreatePrompt = false;
//saveFileDialog.Title = "导出Excel文件到";
saveFileDialog.FileName = strTitle + currentTime + ".xls";
//没有数据的话进行提示
if (dgv.Rows.Count == 0)
{
MessageBox.Show("没有数据可保存,请先抽奖!");
}
else
{
//DialogResult result = saveFileDialog.ShowDialog();//弹出保存对话框
//if (result == DialogResult.OK)//点了保存按钮进入
//{
Stream myStream;//stream类是读写字节数据的数据流类中最基础的基类
myStream = saveFileDialog.OpenFile();//打开用户选定的具有读写权限的文件,并把获取的文件路径赋值给mystream
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));//实例化数据流的写入,encoding获取编码方式
// StreamWriter sw = File.CreateText(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "2.xls");
string strHeaderText = "";
try
{
//表中有数据则进行保存
//写标题
for (int i = 0; i < dgv.ColumnCount; i++)
{
//worksheet.Cells[1, i + 1] = dgv.Columns[i].HeaderText;
if (i > 0)
{
strHeaderText += "\t";
}
strHeaderText += dgv.Columns[i].HeaderText;//获取列标题
}
sw.WriteLine(strHeaderText);
//写内容
string strItemValue = "";
for (int r = 0; r < dgv.Rows.Count; r++)
{
for (int i = 0; i < dgv.ColumnCount; i++)
{
if (i > 0)
{
strItemValue += "\t";
}
strItemValue += dgv.Rows[r].Cells[i].Value.ToString().Trim();
}
sw.WriteLine(strItemValue);//把dgv的每一行的信息写为sw的每一行
strItemValue = "";
}
}
catch (Exception)
{
MessageBox.Show("导出遇到异常", "失败提示");
}
finally
{
// MessageBox.Show(strTitle + currentTime + "成功导出到excel", "提示");
sw.Close();
myStream.Close();
}
}
里边一些注释了的代码打开以后就会变成弹窗选择保存地址那种。
【总结】
这里有很多巨人,多爬到巨人肩膀上踩一踩。 一定要爬上去,亲自踩一踩,光看用处不大的。