大量数据导出Excel 之
刚才准备写这个文章的时候,看到同事发来的群消息,我邪恶了。 我相信看到这篇文章的人 都比较纯,我就跟大家分享一下吧! 主要内容:现在因为需求变化,公司需要一台服务器做中转,公司一MM 准备了一台普通PC机来做服务器,然后问我一同事看下是否可以。 同事A就回复说:不知道这台PC能不能经得住? MM回复:“呵呵.你觉得它哪个部位经受不住?”同事就回复说:“应该不会是暴露的部位 ,怕连续搞受不住,可能会影响使用次数。” ~~ 之后各种联想。(看到这里,思想邪恶的人请点击下面的“推荐+1” 消除罪恶感! )
好了, 冷笑话到此为止。直入主题吧 。 最近公司项目涉及到千百万级别的数据导出问题。 老外(客户)那边又需要整理导出的数据,所以指定需要导出Excel格式的。大家都知道Excel格式的文件最大支持数据是65535条,怎么让千百万级别的数据量显示到同一个Excel里面呢? 在网上浏览了一下,都不如意,最后听说office安装目录有API,于是整理了下。知道答案的请直接点击下面的“推荐+1”然后就可以关掉浏览器了,不知道答案的我也不绕弯子了,请蛋定的看完下面的code,然后点击"推荐+1"。 谢谢 ,供上code:
BeginCode
/// <summary>
/// 大量数据导出
/// </summary>
/// <param name="table"></param>
/// <param name="saveFileName"></param>
public static void ExportToExcel(System.Data.DataTable table, string saveFileName)
{
try
{
if (table == null )
{
return ;
}
bool fileSaved = false ;
// ExcelApp xlApp = new ExcelApp();
Application xlApp = new Application();
if (xlApp == null )
{
return ;
}
Workbooks workbooks = xlApp.Workbooks;
Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet worksheet = (Worksheet)workbook.Worksheets[ 1 ]; // 取得sheet1
long rows = table.Rows.Count;
/* 下边注释的两行代码当数据行数超过行时,出现异常:异常来自HRESULT:0x800A03EC。因为:Excel 2003每个sheet只支持最大行数据
//Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[table.Rows.Count+2, gridview.Columns.View.VisibleColumns.Count+1]);
//fchR.Value2 = datas; */
if (rows > 65535 )
{
long pageRows = 60000 ; // 定义每页显示的行数,行数必须小于
int scount = ( int )(rows / pageRows);
if (scount * pageRows < table.Rows.Count) // 当总行数不被pageRows整除时,经过四舍五入可能页数不准
{
scount = scount + 1 ;
}
for ( int sc = 1 ; sc <= scount; sc++ )
{
if (sc > 1 )
{
object missing = System.Reflection.Missing.Value;
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.Add(
missing, missing, missing, missing); // 添加一个sheet
}
else
{
worksheet = (Worksheet)workbook.Worksheets[sc]; // 取得sheet1
}
string [,] datas = new string [pageRows + 1 , table.Columns.Count + 1 ];
for ( int i = 0 ; i < table.Columns.Count; i++) // 写入字段
{
datas[ 0 , i] = table.Columns[i].Caption;
}
Range range = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[ 1 , table.Columns.Count]);
range.Interior.ColorIndex = 15 ; // 15代表灰色
range.Font.Bold = true ;
range.Font.Size = 9 ;
int init = int .Parse(((sc - 1 ) * pageRows).ToString());
int r = 0 ;
int index = 0 ;
int result;
if (pageRows * sc >= table.Rows.Count)
{
result = table.Rows.Count;
}
else
{
result = int .Parse((pageRows * sc).ToString());
}
for (r = init; r < result; r++ )
{
index = index + 1 ;
for ( int i = 0 ; i < table.Columns.Count; i++ )
{
if (table.Columns[i].DataType == typeof ( string ) || table.Columns[i].DataType == typeof (Decimal) || table.Columns[i].DataType == typeof (DateTime) || table.Columns[i].DataType == typeof ( int ) || table.Columns[i].DataType == typeof ( double ))
{
object obj = table.Rows[r][table.Columns[i].ColumnName];
datas[index, i] = obj == null ? "" : " ' " + obj.ToString().Trim(); // 在obj.ToString()前加单引号是为了防止自动转化格式
}
}
}
Range fchR = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[index + 2 , table.Columns.Count + 1 ]);
fchR.Value2 = datas;
worksheet.Columns.EntireColumn.AutoFit(); // 列宽自适应。
range = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[index + 1 , table.Columns.Count]);
// 15代表灰色
range.Font.Size = 9 ;
range.RowHeight = 14.25 ;
range.Borders.LineStyle = 1 ;
range.HorizontalAlignment = 1 ;
}
}
else
{
string [,] datas = new string [table.Rows.Count + 2 , table.Columns.Count + 1 ];
for ( int i = 0 ; i < table.Columns.Count; i++) // 写入字段
{
datas[ 0 , i] = table.Columns[i].Caption;
}
Range range = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[ 1 , table.Columns.Count]);
range.Interior.ColorIndex = 15 ; // 15代表灰色
range.Font.Bold = true ;
range.Font.Size = 9 ;
int r = 0 ;
for (r = 0 ; r < table.Rows.Count; r++ )
{
for ( int i = 0 ; i < table.Columns.Count; i++ )
{
if (table.Columns[i].DataType == typeof ( string ) || table.Columns[i].DataType == typeof (Decimal) || table.Columns[i].DataType == typeof (DateTime))
{
object obj = table.Rows[r][table.Columns[i].ColumnName];
datas[r + 1 , i] = obj == null ? "" : " ' " + obj.ToString().Trim(); // 在obj.ToString()前加单引号是为了防止自动转化格式
}
}
// System.Windows.Forms.Application.DoEvents();
}
Range fchR = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[table.Rows.Count + 2 , table.Columns.Count + 1 ]);
fchR.Value2 = datas;
worksheet.Columns.EntireColumn.AutoFit(); // 列宽自适应。
range = worksheet.get_Range(worksheet.Cells[ 1 , 1 ], worksheet.Cells[table.Rows.Count + 1 , table.Columns.Count]);
// 15代表灰色
range.Font.Size = 9 ;
range.RowHeight = 14.25 ;
range.Borders.LineStyle = 1 ;
range.HorizontalAlignment = 1 ;
}
if (saveFileName != "" )
{
try
{
workbook.Saved = true ;
workbook.SaveCopyAs(saveFileName);
fileSaved = true ;
}
catch (Exception ex)
{
fileSaved = false ;
}
}
else
{
fileSaved = false ;
}
xlApp.Quit();
GC.Collect(); // 强行销毁
// web后台谈框框,winform可以使用messagebox.. 大家都懂的
System.Web.HttpContext.Current.Response.Write( " <Script Language=JavaScript>...alert('Export Success! File path in D disk root directory.');</Script> " );
}
catch (Exception)
{
System.Web.HttpContext.Current.Response.Write( " <Script Language=JavaScript>...alert('Export Error! please contact administrator!');</Script> " );
}
}
EndCode
图片二:
为了不想蹲局子,我小心翼翼的把敏感数据A掉,我突然发现QQ截图功能弱爆了,还是window自带的截图爽~~
ok就到这里,有错误的地方,敬请拍砖,期待砖砖砸脸 谢谢 再会~~
作者: 阿星
出处: http://HdhCmsTestcnblogs测试数据/axing/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
标签: 大量数据 , Excel , 导出 , DataTable
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息