求将ListView导出到Excel?
求将ListView导出到Excel?要求速度快一些的。
找到了一些代码,但导出速度太慢了,难以忍受。
public static void ExpToExcel(ListView listviewname)
{
if (listviewname.Items.Count == 0) return;
Excel.Application excel = new Excel.Application();
Excel.Workbooks workbooks = excel.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Sheets worksheets = workbook.Worksheets;
Excel.Worksheet sheet = (Excel.Worksheet)worksheets.get_Item(1);
excel.Visible = false;
Excel.Range range;
excel.Cells.Select();
excel.Cells.RowHeight = 20;
excel.Cells.Font.Size = 10;
excel.Cells.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
int rowPos = 2;
range = excel.get_Range(sheet.Cells[rowPos, 1], sheet.Cells[rowPos, 1]);
range.Select();
excel.ScreenUpdating = false;
for (int i = 1; i <= listviewname.Columns.Count; i++)
{
range = excel.get_Range(sheet.Cells[rowPos, i], sheet.Cells[rowPos, i]);
range.Borders.LineStyle = 1;
range.Font.Name = "宋体 ";
range.Font.Size = 16;
range.Font.Bold = true;
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
range.ColumnWidth = 18;
sheet.Cells[rowPos, i] = listviewname.Columns[i - 1].Text.ToString();
}
rowPos++;
foreach (ListViewItem item in listviewname.Items)
{
for (int i = 1; i <= listviewname.Columns.Count; ++i)
{
range = excel.get_Range(sheet.Cells[rowPos, i], sheet.Cells[rowPos, i]);
range.Borders.LineStyle = 1;
range.Font.Name = "宋体 ";
range.Font.Size = 12;
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
sheet.Cells[rowPos, i] = item.SubItems[i - 1].Text;
}
rowPos++;
}
excel.ScreenUpdating = true;
excel.Save( "abc ");
}
上面的代码导出速度太慢了。
------解决方案--------------------
把GridView改为 ListView就好了 ::::::
public partial class ExcelExport : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//Export the GridView to Excel
PrepareGridViewForExport(GridView1);
ExportGridView();
}
private void ExportGridView()
{
string attachment = "attachment; filename=Contacts.xls ";
Response.ClearContent();
Response.AddHeader( "content-disposition ", attachment);
Response.ContentType = "application/ms-excel ";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
GridView1.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}
public override void VerifyRenderingInServerForm(Control control)
{
}
private void PrepareGridViewForExport(Control gv)
{
LinkButton lb = new LinkButton();
Literal l = new Literal();
string name = String.Empty;
for (int i = 0; i < gv.Controls.Count; i++)
{
if (gv.Controls[i].GetType() == typeof(LinkButton))
{
l.Text = (gv.Controls[i] as LinkButton).Text;
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
else if (gv.Controls[i].GetType() == typeof(DropDownList))
{
l.Text = (gv.Controls[i] as DropDownList).SelectedItem.Text;
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
else if (gv.Controls[i].GetType() == typeof(CheckBox))
{
l.Text = (gv.Controls[i] as CheckBox).Checked ? "True " : "False ";
gv.Controls.Remove(gv.Controls[i]);
gv.Controls.AddAt(i, l);
}
if (gv.Controls[i].HasControls())
{
PrepareGridViewForExport(gv.Controls[i]);
}
}
}
}
[解决办法]
你可以不用 PrepareGridViewForExport(Control gv) 函数。它是为 子控件 编写的,就是说,如果 GridView中有Button什么控件的拉,有这垃圾函数就不会影响导出了
[解决办法]
我写了一个,大家看看(放在我的网站上了,欢迎光临:)。
http://www.msproject.cn/Article/fast_Excel_write.aspx
快速保存ListView内存中大量数据到Excel
简介
本文描述如何快速保存ListView内存中大量数据到Excel的WorkSheet。关键之处是使用Range一次存储多行多列数据。