前言

最近在做一个小项目,有个模块的功能涉及到excel的导入导出,并且要求对导出的excel文件部分列和单元格设置为只读不可更改,在网上到处查找了一番资料,结合自己的想法,发现也并不难,这里整理记录一下,给有相同想法和有这个需求的朋友们做个参考。

正文

java导出excel文件用的最多的就用poi的方式,这里也一样。POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook,可用于生成.xls。POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook ,可生成.xlsx后缀的excel文件。

导出的大致的思路,先从数据库查询出要导出的数据,这些数据可以放入一个List<bean>集合中,然后把数据按一定顺序写入excel的文件中,再对写入的数据到excel单元格进行样式设置,再以流的形式传给前端。大概流程就是上面描述的这样,细节还是在于对创建单元格写入数据后的格式进行设置为只读 (其目的就是为了规范化用户的操作,防止误改)

我的处理方式是这样的:为方便和规范用户的使用,在项目里就先创建一个excel的模板,设置两行标题,第一行标题用中文,第二行标题用英文(设置英文的目的是可以用java反射来按字段的方式以便导入导出功能的编写),并将这两行标题设置为锁定,和保护,出这两行外的单元格不锁定,等在写入数据后再根据需要进行是否锁定,在获取数据库的数据后,先对模板文件进行复制,再把数据写入模板的复制文件中,最后再把复制文件以输出流的形式传给前端,再删除复制文件。excel模板文件的手动锁定保护在文章结尾给出。

1.先添加poi的依赖

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

2.service层,调用自己写的ExcelUtil类的exportExcel静态方法

 /*** excel导出,导出当天最新的项目信息,这里提供给controller层调用* @param request* @param response* @return*/@Override@RequestMapping(method = RequestMethod.GET)@ResponseBodypublic String exportExcelMethod(HttpServletRequest request, HttpServletResponse response) {//这里的List<bean>就是你的数据库取出对应的数据,这里有些不方便展示就以此代指了List<Bean> ucmList = getBeanList();try {ExcelUtil.exportExcel(ucmList, response);} catch (Exception e) {e.printStackTrace();}return "导出成功!";}

3.ExcelUtil类的exportExcel静态方法:功能先复制模板一份(不对模板进行操作),然后操作复制体的模板文件,对其进行数据写入,单元格的锁定和解锁设置,再通过流发送给前端,发送完后删除复制体模板文件。

 public static void exportExcel(List<Bean> ucmBoList, HttpServletResponse response) {String templatePath = System.getProperty("user.dir") + File.separator + "report/exceltemplate/";String templateName = "template.xlsx";String templatePathAndName = templatePath + templateName;File templateFile = new File(templatePathAndName);File copyFile = null;if (templateFile != null && templateFile.exists()) {copyFile = copyExcelTemplateByXSSF(templatePath, templateName);} else {return;}if (copyFile != null && copyFile.exists()) {//创建一个工作簿XSSFWorkbook xssfWorkbook = null;//创建工作表XSSFSheet xssfSheet = null;XSSFCellStyle lockCellStyle = null;XSSFCellStyle unLockCellStyle = null;try {xssfWorkbook = new XSSFWorkbook(copyFile);// xssfSheet = xssfWorkbook.createSheet();//这里是用自己已创建好的模板,所以就是getSheet(index)xssfSheet = xssfWorkbook.getSheetAt(0);//创建单元格XSSFCell xssfCell;//创建单元格样式,这里设置是否锁定lockCellStyle = xssfWorkbook.createCellStyle();lockCellStyle.setLocked(true);//创建单元格样式,这里设置不锁定unLockCellStyle = xssfWorkbook.createCellStyle();unLockCellStyle.setLocked(false);if (ucmBoList != null && ucmBoList.size() > 0) {for (int i = 0; i < ucmBoList.size(); i++) {UcmBean ucm = ucmBoList.get(i);//细节,前两行为标题XSSFRow xssfRow = xssfSheet.createRow(i + 2);//录入日期XSSFCell cell0 = xssfRow.createCell(0);cell0.setCellValue(ucm.getOcDate());//业务部门XSSFCell cell1 = xssfRow.createCell(1);cell1.setCellValue(ucm.getBusinessUnit());//项目类别编号XSSFCell cell2 = xssfRow.createCell(2);cell2.setCellValue(ucm.getProjectTypeCode());//项目类别名称XSSFCell cell3 = xssfRow.createCell(3);cell3.setCellValue(ucm.getProjectTypeName());//项目编号XSSFCell cell4 = xssfRow.createCell(4);cell4.setCellValue(ucm.getProjectNo());//项目名称XSSFCell cell5 = xssfRow.createCell(5);cell5.setCellValue(ucm.getProjectName());//项目评级XSSFCell cell6 = xssfRow.createCell(6);cell6.setCellValue(ucm.getProjectRating());//融资主体List<FinancierBO> financierBOList = ucm.getFinancierInfo();String finName = "", finCode = "", finRating = "";if (financierBOList != null && financierBOList.size() > 0) {for (FinancierBO financierBO : financierBOList) {if (financierBO != null) {if (financierBO.getName() != null) {finName = finName + financierBO.getName() + "\n";} else {finName = finName + "" + "\n";}if (financierBO.getUniformCreditCode() != null) {finCode = finCode + financierBO.getUniformCreditCode() + "\n";} else {finCode = finCode + "" + "\n";}if (financierBO.getRating() != null) {finRating = finRating + financierBO.getRating() + "\n";} else {finRating = finRating + "" + "\n";}}}}}//是否体系内业务XSSFCell cell7 = xssfRow.createCell(7);cell7.setCellStyle(unLockCellStyle);if (ucm.getSystemBusinessFlag() != null) {if (ucm.getSystemBusinessFlag()) {cell7.setCellValue("是");} else {cell7.setCellValue("否");}} else {cell7.setCellValue("");}//行业分类XSSFCell cell8 = xssfRow.createCell(8);cell8.setCellStyle(unLockCellStyle);cell8.setCellValue(ucm.getIndtNum());//担保机构评级XSSFCell cell9 = xssfRow.createCell(9);cell9.setCellStyle(unLockCellStyle);cell9.setCellValue(ucm.getGuarantorInstitutionRating());setResponseHeader(response, copyFile.getName());//锁定不锁定只有加了这个才有用(默认都是锁定后就不可以对单元格内容进行更改)xssfSheet.protectSheet("123*456");OutputStream out = response.getOutputStream();xssfWorkbook.write(out);out.flush();out.close();} catch (IOException e) {e.printStackTrace();} catch (InvalidFormatException e) {e.printStackTrace();} finally {if (copyFile.exists()) {copyFile.delete();}System.out.println("成功之后需要,删除复制的模板源文件,以免占用服务器的内存!");}} else {return;}}

4. ExcelUtil类的copyExcelTemplateByXSS静态方法,复制模板文件,并以日期的形式作为文件名

/*** 复制excel的模板** @param excelFilePath 模板路径* @param fileName      模板名称* @return 复制后的模板副本文件,或null*/public static File copyExcelTemplateByXSSF(String excelFilePath, String fileName) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");String now = dateFormat.format(new Date());String templateFilePathAndName = excelFilePath + fileName;String copyFilePathAndName = excelFilePath + "/XXX模板" + now + ".xlsx";File templateFile = new File(templateFilePathAndName);File copyFile = null;XSSFWorkbook xssfWorkbook = null;if (templateFile.exists()) {copyFile = new File(copyFilePathAndName);try {xssfWorkbook = new XSSFWorkbook(templateFile);} catch (InvalidFormatException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {return copyFile;}try {OutputStream out = new FileOutputStream(copyFile);xssfWorkbook.write(out);out.flush();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {//file.delete();}return copyFile;}

5. ExcelUtil类的setResponseHeader方法,用来设置respond的响应体形象,包括编码格式和以附件的形式进行下载

// 发送响应流方法public static void setResponseHeader(HttpServletResponse response, String fileName) {try {try {fileName = new String(fileName.getBytes("gbk"), "ISO8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}//response.setCharacterEncoding("utf-8");response.reset();// 清空输出流//告诉浏览器这个文件的名字和类型,attachment:作为附件下载;inline:直接打开response.setHeader("Content-Disposition", "attachment;filename=" + fileName);// response.setContentType("application/vnd.ms-excel");如果设置为这种就是生成.xls文件response.setContentType("application/msexcel");response.addHeader("Pargam", "no-cache");response.addHeader("Cache-Control", "no-cache");response.setCharacterEncoding("ISO8859-1");} catch (Exception ex) {ex.printStackTrace();}}

6.control层调用service层

@Controller("/file")
public class ExcelController {@AutowiredUcmService ucmService;@RequestMapping("/downLoad")//@ResponseBodypublic void excletest(HttpServletRequest request, HttpServletResponse response){ucmService.exportExcelMethod(request, response);}

以上就是整个处理过程的的大致代码。下面给出excel模板的标题设置为不可修改。选中标题行右键单元格设置-->保护->锁定

-->确定

     

再到审阅,点击保护工作表-->购上下面的钩子,输入密码,再次确认密码即可。然后你想修改就必须输入密码才能更改了。

    

看到这里的,就麻烦点个赞吧!O(∩_∩)O

Java导出excel文件以.xlsx后缀结尾,可设置部分单元格只读相关推荐

  1. java导出excel文件(标题为中文乱码)

    1 Java导出Excel文件 function excelOut(){   window.location.href="../getFileToExcel/"+taskId; } ...

  2. java导出excel文件_POI生成EXCEL文件

    一.背景 根据指定格式的JSON文件生成对应的excel文件,需求如下 支持多sheet 支持单元格合并 支持插入图片 支持单元格样式可定制 需要 标题(title),表头(head),数据(data ...

  3. Java导出excel文件

    需求 将每个xmpp机房的在线/离线用户信息导出到Excel表格中(定时任务+网页按钮),并在网页上提供下载按钮进行下载. 效果预览 导出文件效果 点击下载弹出框效果 代码总览 /** ". ...

  4. Java 导出 Excel 文件

    目前,很多报表,都需要导出Excel文件 首先,maven <dependency><groupId>org.apache.poi</groupId><art ...

  5. 关于Excel操作编写的一个软件设计构思案例[连载] --如何把处理好后的数据导出Excel文件中(含背景\字体颜色设置)

    导出数据到Excel文件中二种方法四种形式:其一是创建新的Excel文件实例写入数据:其二是打开已有Excel文档对其执行更新或插入数据:保存文档方法有:直接保存(2种).另存.间接保存.接下来分别介 ...

  6. Html导出Excel文件(兼容所有浏览器,支持设置文件名)

    实例demo免费下载:http://download.csdn.net/detail/qq285679784/9764940 页面演示 IE导出效果 其它浏览器导出效果 HTML CODE: < ...

  7. 基于java + easyExcel实现模板填充生成动态模板并设置指定单元格为下拉框样式

    需求描述:java后端开发过程中,为了满足动态生成excel模板并设置指定单元格为下拉框,且下拉框的数据项来源为动态查询的需求,在基于easyExcel的情况下,使用模板填充的方式,完成该需求. 1. ...

  8. java导出excel文件,设置单个单元格内字段不同样式

    最近在做文件模板下载,有需求提出,部分字段需要使用*来标明必填,而且必须是红色,因此,在网上百度之后,终于找到参考文档,参考地址贴在最后. public static void main( Strin ...

  9. java导出excel文件内容中文乱码解决

    记录一个excel导出中发现的问题. 最近使用了EasyExcel这个工具类进行excel的导出,这个类很方便,配合注解和封装的方法,可以很容易的对需要导出的excel或者已有的excel进行行列或者 ...

最新文章

  1. phpversion() 与 phpinfo()
  2. 春天里:丁丁与赵亚楠
  3. day10 in india
  4. 2012届华为校园招聘机试题
  5. kaggle上面的score以及ROC_AUC数值咋回事
  6. C# 如何转换生成长整型的时间
  7. 这个时代会残酷惩罚不肯改变的人
  8. PAT乙级1028 人口普查 (20 分)
  9. 机器学习hierarchical clustering_材料学+AI:非监督学习预测新型固态锂离子导体材料...
  10. 回归本源:JavaScript 之中的值和引用
  11. Parallels Desktop 17 亮点整理,7 大改进与变化
  12. Pig-0.13.0的编译
  13. 常见的IT自动化运维工具有哪些?推荐一款好用的?
  14. 解决在局域网内QQ传文件慢的问题(转)
  15. 风行状告芒果卫视,电视台“耍霸道”屡禁不止?
  16. IDEA插件(BindED)——查看class文件的十六进制
  17. Pikachu漏洞靶场 敏感信息泄露
  18. tableau-瀑布图
  19. CAGD(计算机辅助几何设计)大作业
  20. Kali + Win10双系统下的grub问题

热门文章

  1. android视频编码格式,Android,ios平台上x264编码实时视频参数设置与优化 | 贝壳博客...
  2. WITNESS高级教程
  3. oneTab的使用也会让Chrome 卡顿
  4. 人在江湖走,谁能不忘事
  5. ThinkPad E450(c)添加或者更换内存条的一些问题
  6. 利用OneDrive网盘建站
  7. 关于技术部管理的一些思考
  8. Linux程序员语录,Linux和Git之父 Linus Torvalds 的那些经典语录
  9. Docker中安装并配置redis
  10. 高德地图插件的简单使用