大规模后台导出Excel无法并发

9 篇文章 0 订阅
8 篇文章 0 订阅

近日,完成一个功能。需要后台在数据库导出数据,然后,生成Excel发送给前端。

原来的程序,是C#写的,采取简易原则,继续在原有工程上实现。

碰到的第一个问题是,原有的ApiController不支持Response语法。于是,改为Controller实现。

第二个问题,是Excel的导出库。

最开始,试图用CSV作为Excel导出,发现部分数据会存在格式问题,于是,最终采用了Excel导出库。最后,综合以后,选用NPOI库。样例代码如下:

public class FileDownController : Controller
{
    private void createExport(List<AccountInfoAndFee> list, out string strRealPath)
	{
		HSSFWorkbook workbook = new HSSFWorkbook();
		FileStream fileNum = null;
		
		try
		{
			// 1.检测是否存在根文件夹,若不存在就建立个文件夹
			if (!Directory.Exists("需要保存的文件路径"))
			{
				Directory.CreateDirectory(CommonFiles.FILE_ROOT_PATH + id);
			}

			strRealPath = 实际文件路径; //需要更改

			// 工作簿 
			ISheet sheet = workbook.CreateSheet("数据");

			// 工作表 
			IRow row = sheet.CreateRow(0);
			createExcleHeader(ref row, ref sheet);

			int j = 0;

			int k = 0;

			//while(k++ < 10)
			//{
			for (int i = 0; i < list.Count(); i++)
			{
				//数据处理过程
				IRow rowTmp = sheet.CreateRow(i + 1);
				rowTmp.CreateCell(0).SetCellValue(""); //后续数据同样处理
			}

			// 4.生成文件 
			
			fileNum = new FileStream(strRealPath + fileName + ".xls", FileMode.Create);
			workbook.Write(fileNum);
			fileNum.Flush();
			fileNum.Close();
			workbook.Clear();
			workbook.Close();

			Log.Error("文件" + strRealPath + fileName + " 总行数: " + list.Count().ToString());
		}
		catch (Exception ex)
		{
			Log.Error(ex, ex.StackTrace);
			Log.Error(ex, ex.Message);
			throw ex;
		}
		finally
		{
			workbook.Close();
			if (fileNum != null)
			{
				fileNum.Close();
			}
		}
	}

    private void getFiles(string fileSrcName)
     {
	    Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename);
	    Response.ContentType = "application/ms-excel";
	    Response.TransmitFile(fileSrcName);
	    Response.Flush();
	    Response.End();

	    removeFiles(strFilePath);
    }
}

在使用NPOI时,发现一个问题为:HSSFWorkbook 只支持65535行。首先考虑的是,换为XSSFWorkbook。但发现,即使是XSSFWorkbook,依然也存在文件最多数量限制。于是解决方案为:还用HSSFWorkbook,但到65535行时,就生成一个文件。

但这样的问题就又来了,就HTTP传输为1个文件。方法为:压缩Excel文件为1个压缩文件。

但依然存在很重要的问题:那就是,NPOI在写大文件时,只支持一个写过程,否则会出错。

突然想到《Hadoop原理》上的话:人们发现,即使是最大的大象,它的拉车能力也是有限的;但人们不会培养更大的大象,而是让多个大象来拉车

于是,方法就提供出来了:提供多个服务器,分别为多个请求提供服务。

于是,问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值