C# DataGridView 导出Excle代码和总结(转)
2016-04-20 09:16
513 查看
http://www.cnblogs.com/loveqin24/archive/2012/04/09/2439071.html
1、导出很快的方式;
1.1、设置数字不以科学计数法显示 设置Rang xlRang.NumberFormat = "@";就ok了。
1.2、设置一列的格式:
e.Item.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@");//防止以科学计数法显示
e.Item.Cells[4].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00");
这句不起作用:worksheetData.Cells.Style = "vnd.ms-excel.numberformat:@";我不懂是什么
2、一行一行的写出的方式;这种方式较慢!
public void DataGridViewToExcel()
{
SaveFileDialog kk = new SaveFileDialog();
kk.Title = "保存EXECL文件";
kk.Filter = "EXECL文件(*.xls) |*.xls |所有文件(*.*) |*.*";
kk.FilterIndex = 1;
if (kk.ShowDialog() == DialogResult.OK)
{
string FileName = kk.FileName + ".xls";
if (File.Exists(FileName))
File.Delete(FileName);
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine = "";
objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
for (int i = 0; i < ViewMaster.Columns.Count; i++)
{
if (ViewMaster.Columns[i].Visible == true)
{
strLine = strLine + ViewMaster.Columns[i].HeaderText.ToString() + Convert.ToChar(9);
}
}
objStreamWriter.WriteLine(strLine);
strLine = "";
for (int i = 0; i < ViewMaster.Rows.Count; i++)
{
if (ViewMaster.Columns[0].Visible == true)
{
if (ViewMaster.Rows[i].Cells[0].Value == null)
strLine = strLine + " " + Convert.ToChar(9);
else
strLine = strLine + ViewMaster.Rows[i].Cells[0].Value.ToString() + Convert.ToChar(9);
}
for (int j = 1; j < ViewMaster.Columns.Count; j++)
{
if (ViewMaster.Columns[j].Visible == true)
{
if (ViewMaster.Rows[i].Cells[j].Value == null)
strLine = strLine + " " + Convert.ToChar(9);
else
{
string rowstr = "";
rowstr = ViewMaster.Rows[i].Cells[j].Value.ToString();
if (rowstr.IndexOf("\r\n") > 0)
rowstr = rowstr.Replace("\r\n", " ");
if (rowstr.IndexOf("\t") > 0)
rowstr = rowstr.Replace("\t", " ");
strLine = strLine + rowstr + Convert.ToChar(9);
}
}
}
objStreamWriter.WriteLine(strLine);
strLine = "";
}
objStreamWriter.Close();
objFileStream.Close();
MessageBox.Show(this, "保存EXCEL成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
1、导出很快的方式;
1.1、设置数字不以科学计数法显示 设置Rang xlRang.NumberFormat = "@";就ok了。
1.2、设置一列的格式:
e.Item.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@");//防止以科学计数法显示
e.Item.Cells[4].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00");
public bool DataGridViewToExcelFast(DataGridView dataGridView1, string fileName, int n) { int ExcelColumns = 0; if (dataGridView1.Rows.Count > 65536) { if (MessageBox.Show("数据行大于Excel2003所容许的最大行数65535行,继续导出可能会引发错误,是否继续?", "提示信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.No) { return false; } } System.Reflection.Missing miss = System.Reflection.Missing.Value; //创建EXCEL对象appExcel,Workbook对象,Worksheet对象,Range对象 Microsoft.Office.Interop.Excel.Application appExcel = null; appExcel = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook workbookData; Microsoft.Office.Interop.Excel.Worksheet worksheetData; Microsoft.Office.Interop.Excel.Range rangedata; //设置对象不可见 appExcel.Visible = false; /* 在调用Excel应用程序,或创建Excel工作簿之前,记着加上下面的两行代码 * 这是因为Excel有一个Bug,如果你的操作系统的环境不是英文的,而Excel就会在执行下面的代码时,报异常。 */ System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); workbookData = appExcel.Workbooks.Add(miss); worksheetData = (Microsoft.Office.Interop.Excel.Worksheet)workbookData.Worksheets.Add(miss, miss, miss, miss); //worksheetData.Cells.Style = "vnd.ms-excel.numberformat:@"; //给工作表赋名称 //worksheetData.Name = "MySheet"; // 保存到WorkSheet的表头,你应该看到,是一个Cell一个Cell的存储,这样效率特别低,解决的办法是,使用Rang,一块一块地存储到Excel ExcelColumns = 0; for (int i = 0; i < dataGridView1.ColumnCount; i++) { if (!dataGridView1.Columns[i].Visible) { continue; } worksheetData.Cells[1, ++ExcelColumns] = dataGridView1.Columns[i].HeaderText.ToString(); } //先给Range对象一个范围为A2开始,Range对象可以给一个CELL的范围,也可以给例如A1到H10这样的范围 //因为第一行已经写了表头,所以所有数据都应该从A2开始 rangedata = worksheetData.get_Range("A2", miss); Microsoft.Office.Interop.Excel.Range xlRang = null; //iRowCount为实际行数,最大行 int iRowCount = dataGridView1.RowCount; int iParstedRow = 0, iCurrSize = 0; //iEachSize为每次写行的数值,可以自己设置,每次写1000行和每次写2000行大家可以自己测试下效率 int iEachSize = 1000; //iColumnAccount为实际列数,最大列数 int iColumnAccount = dataGridView1.ColumnCount; //在内存中声明一个iEachSize×iColumnAccount的数组,iEachSize是每次最大存储的行数,iColumnAccount就是存储的实际列数 object[,] objVal = new object[iEachSize, iColumnAccount]; try { iCurrSize = iEachSize; //计算Excel列头 string En = NumToEn(iColumnAccount); while (iParstedRow < iRowCount) { if ((iRowCount - iParstedRow) < iEachSize) iCurrSize = iRowCount - iParstedRow; //用FOR循环给数组赋值 for (int i = 0; i < iCurrSize; i++) { try { for (int j = 0; j < iColumnAccount; j++) { if (!dataGridView1.Columns[j].Visible) { continue; } objVal[i, j] = dataGridView1[j, i + iParstedRow].Value == null ? "" : dataGridView1[j, i + iParstedRow].Value.ToString(); } System.Windows.Forms.Application.DoEvents(); } catch (Exception e) { MessageBox.Show(e.ToString()); } } /* * 建议使用设置断点研究下哈 * 例如A1到H10的意思是从A到H,第一行到第十行 * 下句很关键,要保证获取Sheet中对应的Range范围 * 下句实际上是得到这样的一个代码语句xlRang = worksheetData.get_Range("A2","H100"); * 注意看实现的过程 * 'A' + iColumnAccount - 1这儿是获取你的最后列,A的数字码为65,大家可以仔细看下是不是得到最后列的字母 * iParstedRow + iCurrSize + 1获取最后行 * 若WHILE第一次循环的话这应该是A2,最后列字母+最后行数字 * iParstedRow + 2要注意,每次循环这个值不一样,他取决于你每次循环RANGE取了多大,循环了几次,也就是iEachSize设置值的大小哦 */ //xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + 2)).ToString(), ((char)('A' + iColumnAccount - 1)).ToString() + ((int)(iParstedRow + iCurrSize + 1)).ToString()); //**********从A2开始写*************** xlRang = worksheetData.get_Range("A" + ((int)(iParstedRow + 2)).ToString(), En + ((int)(iParstedRow + iCurrSize + 1)).ToString()); xlRang.NumberFormat = "@"; // 调用Range的Value2属性,把内存中的值赋给Excel xlRang.Value2 = objVal; iParstedRow = iParstedRow + iCurrSize; } //保存工作表 worksheetData.SaveAs(fileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRang); xlRang = null; //调用方法关闭EXCEL进程,大家可以试下不用的话如果程序不关闭在进程里一直会有EXCEL.EXE这个进程并锁定你的EXCEL表格 this.KillSpecialExcel(appExcel); MessageBox.Show("数据已经成功导出到:" + fileName, "导出完成", MessageBoxButtons.OK, MessageBoxIcon.Information); // 别忘了在结束程序之前恢复你的环境! System.Threading.Thread.CurrentThread.CurrentCulture = CurrentCI; return true; } catch (Exception ex) { this.KillSpecialExcel(appExcel); MessageBox.Show(ex.Message); return false; } }
这句不起作用:worksheetData.Cells.Style = "vnd.ms-excel.numberformat:@";我不懂是什么
2、一行一行的写出的方式;这种方式较慢!
public void DataGridViewToExcel()
{
SaveFileDialog kk = new SaveFileDialog();
kk.Title = "保存EXECL文件";
kk.Filter = "EXECL文件(*.xls) |*.xls |所有文件(*.*) |*.*";
kk.FilterIndex = 1;
if (kk.ShowDialog() == DialogResult.OK)
{
string FileName = kk.FileName + ".xls";
if (File.Exists(FileName))
File.Delete(FileName);
FileStream objFileStream;
StreamWriter objStreamWriter;
string strLine = "";
objFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Write);
objStreamWriter = new StreamWriter(objFileStream, System.Text.Encoding.Unicode);
for (int i = 0; i < ViewMaster.Columns.Count; i++)
{
if (ViewMaster.Columns[i].Visible == true)
{
strLine = strLine + ViewMaster.Columns[i].HeaderText.ToString() + Convert.ToChar(9);
}
}
objStreamWriter.WriteLine(strLine);
strLine = "";
for (int i = 0; i < ViewMaster.Rows.Count; i++)
{
if (ViewMaster.Columns[0].Visible == true)
{
if (ViewMaster.Rows[i].Cells[0].Value == null)
strLine = strLine + " " + Convert.ToChar(9);
else
strLine = strLine + ViewMaster.Rows[i].Cells[0].Value.ToString() + Convert.ToChar(9);
}
for (int j = 1; j < ViewMaster.Columns.Count; j++)
{
if (ViewMaster.Columns[j].Visible == true)
{
if (ViewMaster.Rows[i].Cells[j].Value == null)
strLine = strLine + " " + Convert.ToChar(9);
else
{
string rowstr = "";
rowstr = ViewMaster.Rows[i].Cells[j].Value.ToString();
if (rowstr.IndexOf("\r\n") > 0)
rowstr = rowstr.Replace("\r\n", " ");
if (rowstr.IndexOf("\t") > 0)
rowstr = rowstr.Replace("\t", " ");
strLine = strLine + rowstr + Convert.ToChar(9);
}
}
}
objStreamWriter.WriteLine(strLine);
strLine = "";
}
objStreamWriter.Close();
objFileStream.Close();
MessageBox.Show(this, "保存EXCEL成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
相关文章推荐
- C# Winform 遍历面板控件,写入XML
- <Pro WPF 4.5 in C#> - Note-03
- ref和out的区别
- C#学习笔记 day_three
- C#的Enum中Flags的用法
- C# indexof如何截取两个特定字符之间的字符串
- C#泛型文章汇总
- C#求完数的代码
- 在 Visual C# 中,模拟登录界面与主窗体的交互
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里