IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 大规模后台导出Excel无法并发 -> 正文阅读

[Java知识库]大规模后台导出Excel无法并发

近日,完成一个功能。需要后台在数据库导出数据,然后,生成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原理》上的话:人们发现,即使是最大的大象,它的拉车能力也是有限的;但人们不会培养更大的大象,而是让多个大象来拉车

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

于是,问题解决。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:33:33  更:2022-05-01 15:36:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:09:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码