java向excel写入数据
❶ java多线程进行大批量excel数据导入实现方案
导入大批量Excel数据到其他平台时,选择Java作为开发语言并非最佳选项,通常公司内使用的如SQL Server更适合处理Excel数据。访问Excel数据的方法有几种,具体选择取决于性能需求和业务场景。
方法一:使用JExcel API。此方法直接操作Excel文件,适合数据量不大且对性能要求不高的场景。在多线程导入时,可将数据分类分块,每个线程处理一块数据,提升导入效率。
方法二:将Excel数据转换为CSV格式,再导入到目标平台。这种方法相对方法一在性能上有所提升,同时减少了对Java库的依赖。同样在多线程环境下,可以实现数据分块导入,提高处理速度。
方法三:使用第三方库如Apache POI,实现更为复杂的数据操作和转换。这种方法灵活性强,适用于处理大量数据和复杂业务逻辑。在多线程导入时,数据分块处理也是关键策略,以优化性能。
从业务实现的角度考虑,如果导入操作是频繁需求,建议优先选择方法一或方法二。引入额外的转换工作虽增加了开发工作量,但在性能和稳定性方面能提供更好的支持。在多线程环境下,合理数据分块策略是关键,确保每个线程处理的数据量适中,避免资源浪费,提高导入效率。
❷ Java操作Excel
在开发项目中,特别是管理系统,处理数据库与Excel数据交互时,Apache POI和EasyExcel是常用工具。POI将Excel数据一次性加载到内存,再写入文件,而EasyExcel则是按行写入,更加节省内存。
操作步骤如下:
1. 创建Maven项目,POI需要根据Excel版本导入不同依赖。
2. 使用POI进行写入,注意区分03和07版本,大文件时需选择HSSF或XSSF,HSSF处理量有限但速度快,XSSF支持大量数据但速度慢且内存消耗大。
3. POI读取Excel时,注意不同版本和数据类型,需要判断单元格类型读取相应值,计算公式也能获取。
相比之下,EasyExcel更易用,内存效率高。它支持简单、内存省内存地处理大文件Excel,且有详细的官方文档。使用时需导入依赖,定义类,然后根据需求进行读写,如指定列导出、格式转换等。
读取时,EasyExcel支持指定列名或下标,并支持自定义格式转换。例如,读取多个Sheet或进行格式化,只需调整代码即可。
总结来说,选择POI还是EasyExcel,取决于数据量、性能需求和项目复杂度。POI适合处理小到中等规模数据,而EasyExcel更适用于大数据量和内存敏感的场景。下文将更详细讨论EasyExcel的读写操作,代码更简洁,阅读体验更佳。
❸ 如何用java向指定的Excel中写入数据
jxl,可以实现,开源的jar包很多,目前我使用的是jxl
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String id =req.getParameter("id");
String fileName =req.getParameter("fileName");
File f = new File(req.getSession().getServletContext().getRealPath("/printTemplateExcel/"+fileName));
WritableWorkbook wwb=null;
WritableSheet wws=null;
FileOutputStream out =null;
Label label = null;
Workbook wb=null;
try {
FesOrders fesOrders =new FesOrders();
fesOrders.setId(Long.parseLong(id));
List<FesOrders> fesOrdersList = fesOrderService.findList(fesOrders, (SysUser)req.getSession().getAttribute(SESSION_USER));
for(FesOrders a : fesOrdersList){
System.out.println(a.getId());
}
WritableFont headerFont =new WritableFont(WritableFont.createFont("新宋体"), 10, WritableFont.BOLD, false,UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
WritableCellFormat dataFormat=new WritableCellFormat (headerFont);
dataFormat.setBorder(Border.ALL,BorderLineStyle.THIN,Colour.BLACK);//设置边框
WritableCellFormat wf = new WritableCellFormat(dataFormat);
wb = Workbook.getWorkbook(f);
out = new FileOutputStream(new File(req.getSession().getServletContext().getRealPath("/printExcel/"+fileName)));
wwb = Workbook.createWorkbook(out, wb);
wws = wwb.getSheet("出货单");
String date=sdf.format(new Date());
for(int i=0;i<wws.getRows();i++){
for(int j=0;j<wws.getColumns();j++){
Cell cell = wws.getCell(j, i);
if(cell.getContents().trim().indexOf("${year}")>0){
label = (Label)cell;
label.setString(cell.getContents().replace("${year}", date.subSequence(0, 4)));
}
if(cell.getContents().trim().indexOf("${mouth}")>0){
label = (Label)cell;
label.setString(cell.getContents().replace("${mouth}", date.substring(5, 7)));
}
if(cell.getContents().trim().indexOf("${day}")>0){
label = (Label)cell;
label.setString(cell.getContents().replace("${day}", date.substring(8, 10)));
}
}
}
System.out.println(fesOrdersList.size());
for(int i=0;i<fesOrdersList.size();i++){
FesOrders fesOrder= fesOrdersList.get(i);
List<FesSendOrders> fesSendOrders=fesOrder.getFesSendOrderses();
wws.addCell(new Label(0,i+2,i+1+"",wf));
wws.addCell(new Label(1,i+2,fesOrder.getSysUser().getCnName(),wf));
wws.addCell(new Label(2,i+2,fesOrder.getInnerSendNo(),wf));
wws.addCell(new Label(3,i+2,fesSendOrders.get(0).getFesTransportModes().getName(),wf));
if(fesSendOrders.get(0).getOpWeight()!=null){
wws.addCell(new Label(4,i+2,fesSendOrders.get(0).getOpWeight().toString(),wf));
}
wws.addCell(new Label(5,i+2,"",wf));
wws.addCell(new Label(6,i+2,fesSendOrders.get(0).getFesAddresseesBySenderId().getAddress(),wf));
wws.addCell(new Label(7,i+2,"",wf));
wws.addCell(new Label(8,i+2,fesOrder.getOrderNo(),wf));
wws.addCell(new Label(9,i+2,"",wf));
}
wwb.write();
wwb.close();
out.flush();
out.close();
download(req,res,fileName);
这个是我写的简单的导出excel