精华内容
下载资源
问答
  • 前言 自学做一个小demo,有个功能涉及excel导入导出,在网上到处查找了一番,发先也并不难,这里整理记录一下,给有相同想法朋友们做个参考。 正文

    前言

    最近在做一个小项目,有个模块的功能涉及到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)
        @ResponseBody
        public 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 {
    
        @Autowired
        UcmService ucmService;
    
        @RequestMapping("/downLoad")
        //@ResponseBody
        public void excletest(HttpServletRequest request, HttpServletResponse response){
              ucmService.exportExcelMethod(request, response);
        }

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

    -->确定

          

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

        

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

    展开全文
  • 今天 客户提问题说,导出的excel文件,该换行的单元格没有换行。通过查找资源找到了解决方法。翻出来源码开了下,字符串中使用换行的方法为"Name:{$name}\nAddress:{$adress}\nCity:{$city}\nCountry:{$country}\n ....
    今天 客户提问题说,导出的excel文件,该换行的单元格没有换行。通过查找资源找到了解决方法。
    翻出来源码开了下,字符串中使用换行的方法为"Name:{$name}\nAddress:{$adress}\nCity:{$city}\nCountry:{$country}\n ......"
    既然"\n"起不到换行的目的,修改成"\r\n"看看.
    修改 =》 提交 =》测试
    得出的结果还是 没有换行!!!!
    难道是操作系统兼容问题??
    直接使用php runtime 常量 PHP_EOL 替代 "\r\n"
    修改 =》 提交 =》测试
    得出的结果还是 没有换行!!!!
    什么情况? 不可能这个也解决不了 操作系统兼容性问题的换行符号。
    看看到底这个xls文件是怎么用php生成的。
    看了下 生成excel的代码,Oh My Lady gaga,原来是用html的格式,只是文件后缀写成xls,既然html的格式,那么应该<br />可以起到换行的效果吧。
    继续
    修改 =》 提交 =》测试
    结果是 可以换行了。 可喜可贺啊。问题终于解决了。
    告诉老大问题解决,此时心中甚是喜悦啊。

    过了一刻钟的样子,老大跑过来说:“换行效果的问题是解决了,但是你看下,数据不好复制了。”
    。。。。
    省略沟通N句。
    把一个单元格的数据复制下,然后 粘贴到 word中。Oh My Lady gaga, 为啥会有border????
    到底什么问题?? 使用\n、\r\n 把不能起到换行的相关,使用<br />把效果是有了,但是又出现了新问题。。。 到底如何是好?
    没辙了,使用BAIDU google吧。
    终于 黄天不负有心人,找到了问题的答案。
    在<style></styel>标签中追加 CSS样式br {mso-data-placement:same-cell;}
    终于 问题 完美解决。
    原文如下:
    复制代码 代码如下:

    将HTML文件的扩展名改为XLS后,用Excel打开,里边的每个<br />都会使后边的文字进入另一个单元格,要使<br />在一个单元格内起到换行的作用,可以在CSS里加入这一句:
    br {mso-data-placement:same-cell;}

    Excel就会把<br />解释成回车了。


    在此多谢“卡卡西的真面目” 这位仁兄 把 知识分享出来。 要不然的话,不知道我还要折腾到什么时候才能解决!!

    转载于:https://www.cnblogs.com/holyes/archive/2012/06/26/fb2248874a28f93bdf4033296f042365.html

    展开全文
  • 因为要做excel导入导出,发现再导入时候总是因为科学计数法,公式什么导致没有取正确值,在网上也找到了一些,但是发现都是旧版本,因此看了一下阿帕奇poi官方文档进行了一些修改。 下面是在网上...

    因为要做excel的导入导出,发现再导入的时候总是因为科学计数法,公式什么的导致没有取到正确的值,在网上也找到了一些,但是发现都是旧版本的,因此看了一下阿帕奇poi的官方文档进行了一些修改。

    下面的是在网上查找的,地址是http://blog.sina.com.cn/s/blog_69398ed90102wdl7.html,时间是2016年

    public static String getValue(HSSFCell cell){
     if (null != cell) {     
              switch (cell.getCellType()) {     
              case HSSFCell.CELL_TYPE_NUMERIC: // 数字     
                 return cell.getNumericCellValue()     
                          + "   ";     
              case HSSFCell.CELL_TYPE_STRING: // 字符串     
                  return cell.getStringCellValue()     
                          + "   ";     
              case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean     
                  return cell.getBooleanCellValue()     
                          + "   ";     
              case HSSFCell.CELL_TYPE_FORMULA: // 公式     
                  return cell.getCellFormula() + "   ";     
              case HSSFCell.CELL_TYPE_BLANK: // 空值     
                  return "";    
              case HSSFCell.CELL_TYPE_ERROR: // 故障     
                return "";
              default:     
                  return "未知类型   ";     
              }     
          }else{
         return "";
          } 
      }
    下面这个是自己修改的
    public String getValue(XSSFCell cell) {
    if (null != cell) {
    switch (cell.getCellTypeEnum()) {
    case NUMERIC: // 数字
    DecimalFormat df = new DecimalFormat("0");//处理科学计数法
    String val = df.format(cell.getNumericCellValue());
    return val;
    case STRING: // 字符串
    return cell.getStringCellValue() + "";
    case BOOLEAN: // Boolean
    return cell.getBooleanCellValue() + "";
    case FORMULA: // 公式
    return cell.getCellFormula() + "   ";
    case BLANK: // 空值
    return "";
    case ERROR: // 故障
    return "";
    default:
    return "未知类型   ";
    }
    } else {
    return "";
    }
    }

    展开全文
  • 5.传统的方法,就是向Excel表格对应的单元格一个一个插入数据,此种方法是最原始的,也是最慢的 6.通过借助VSFlexGrid控件(一个相当相当好用的数据展示控件)的SaveGrid方法导出导出过程瞬间完成,即使电脑上不...
  • 我之前遇到这个问题,上网查找解决方案。都说要在Excel中设置复选框链接单元格,然后通过赋值给单元格控制复选框勾选。... 还是string 生成Excel中复选框都没有受到单元格影响。 正

    我之前遇到这个问题,上网查找解决方案。都说要在Excel中设置复选框的链接单元格,然后通过赋值给单元格控制复选框的勾选。

    在我设置好链接单元格之后,点击复选框,单元格中的值会改变 TRUE 或 FALSE。然后我在后台设置传递过来的值也就是TRUE 或 FALSE。但是这个是行不通的。不管我设置成boolean 还是string 生成的Excel中的复选框都没有受到单元格中的值的影响。

    正确的传值应该是 0 或 1(你设置其他的数字也行)。 数字0不勾选,其他数字都是勾选。

    这是我在写vba时无意发现的,因为我不会vba,然后写了一个测试,为了方便我在里面的判断用的是否=1,然后我更改单元格时复选框也变了。然后我测试发现在给单元格的值除了0以外的数字都是勾选,然后我改了一下后台代码,传过来一个数字赋值给复选框关联的单元格,然后复选框被我传递过来的值影响到了。

    在这我不得不吐槽一下网上其他的类似的答案。都说通过设置复选框链接单元格来控制,但是传TRUE 或 FALSE根本没点用,然后还说去看jxls的api,或者写些什么vba代码。我之前也是这样做的,然后看代码看的我崩溃。这个问题我看网上老早就有了,但是就是没一个人把具体解决方案发出来。让这么一个小问题搞得我头疼死了。

    我从不生产代码,我只是代码的搬运工。

    展开全文
  • 在R中有一个数据框(data.frame),想将其导入Excel表中,但是其中有缺失值,想导出后效果为这样,缺失值NA所在的单元格自动变成空白,就是什么都没有的样子(不使用Excel查找替换功能。) 想问一下用R语言该怎么...
  • HSSFWorkbook在多线程导出报表时报错情况处理。 错误情况:本打算5W每条在每个sheet界面异步写入但总是出现线程阻塞。 打开excel ,在写入sheet阻塞界面最后一个单元格内出现了表头值。 线程一直在running...
  • // 设置单元格的文字格式 WritableFont wf = new WritableFont(WritableFont.ARIAL, 12, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK); WritableCellFormat wcf = new ...
  • 在开发一个桌面应用,从数据导出到一个datagrid,然后在datagrid编辑,编辑后更新数据数据库,发现以下问题 编辑方式有两种: 1、 双击单元格,手工输入数据,这种情况可以更新数据库,但只能一个个单元格...
  • 通过jasperSoft制作jrxml文件,导入系统中后,能够实现表格的导出功能。 但是在插入新行时候发现,有些单元格是合并过,一旦插入了新行,之前合并就会取消掉。 插入行样式如下: 分析 查找了一下各类...
  • 50.对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,相当于多个vlookup函数相加,对于查找到的元素在批注中添加,以提醒用户。 51.根据个人所得税(工资)反算工资数 52....
  • Excel新增工具集

    2011-12-20 09:30:27
    10、检查两列同行两单元格是否相同:由ID号意义相同从表向主表合并列记录时,往往先将从表记录粘贴主表中,然后删除从表中ID等与主表重复列记录,本命令用来比较两列同行单元格(ID号)是否相同。 (九)工作...
  • 慧办公 H6.61

    2014-10-23 14:21:11
    28、1秒钟,批量重命名任意格式文件【有 添加前后缀、以单元格内容命名、名称加序号、查找替换字符 四种形式】 29、移动工作表【解决xlsx格式不能向xls格式移动工作表问题】 30、自定义格式与自定义函数
  • 实例217 如何导出对象库中商业决策分析程序 实例218 如何打印含有图像字段数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录批量删除 实例221 如何实现数据库记录批量修改 实例...
  • VBA常用技巧

    2014-12-21 16:39:28
    190-3 使用更快的单元格操作方法 12 190-4 使用With语句引用对象 12 190-5 少用激活或选择语句 12 技巧191 取得文件的基本名称 12 技巧192 防止用户中断代码运行 12 技巧193 加班费计算表 12 技巧194 制作发放条 12 ...
  • VBA编程技巧大全

    2013-08-05 09:03:19
    190-3 使用更快的单元格操作方法 465 190-4 使用With语句引用对象 466 190-5 少用激活或选择语句 468 技巧191 取得文件的基本名称 469 技巧192 防止用户中断代码运行 470 技巧193 加班费计算表 472 技巧194 制作发放...
  • 安装后工作界面左上角绿区有使用说明,凡单元格右上角有红色三角都可把鼠标移上面看说明. 6.安装过程中没有结束时请勿进行任何操作,出现黑色命令窗口时应待其自动关闭,不可手动关。安装后期出现有关添加注册表...
  • 实例217 如何导出对象库中商业决策分析程序 实例218 如何打印含有图像字段数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录批量删除 实例221 如何实现数据库记录批量修改 实例...
  • 实例062 单元格的边框变色 实例063 表格外边框具有霓虹灯效果 实例064 控制表格指定外边框不显示 实例065 背景颜色渐变表格 实例066 表格隔行变色 实例067 表格隔列变色 实例068 鼠标经过表格时,显示提示...
  • 实例062 单元格的边框变色 实例063 表格外边框具有霓虹灯效果 实例064 控制表格指定外边框不显示 实例065 背景颜色渐变表格 实例066 表格隔行变色 实例067 表格隔列变色 实例068 鼠标经过表格时,显示提示...
  • 实例217 如何导出对象库中商业决策分析程序 实例218 如何打印含有图像字段数据库表 实例219 如何实现数据库表整表复制 实例220 如何实现数据库记录批量删除 实例221 如何实现数据库记录批量修改 实例...
  • 【批量导出图片】:将当前表所有嵌入图片导出到硬盘中成为JPG图片。 【生成个性化批注】:Excel本身只有方形批注,本工具可以生各种花样变体批注,美观大方 【插入GIF动画】:将GIF动画插入工作表中并播放,...
  • 【批量导出图片】:将当前表所有嵌入图片导出到硬盘中成为JPG图片。 【生成个性化批注】:Excel本身只有方形批注,本工具可以生各种花样变体批注,美观大方 【插入GIF动画】:将GIF动画插入工作表中并播放,自动...
  • Luckysheet是一款纯前端类似excel在线表格,功能强大、配置简单、完全开源。...7、增强功能:数据透视表,图表,评论,共享编辑,插入图片,矩阵计算,截图,复制其他格式,EXCEL导入及导出等。
  • Excel百宝箱9.0无限制破解版

    热门讨论 2012-02-03 19:05:29
    【取消合并还原合并数据】:对一列中合并后的单元格取消合并,且恢复合并前所有数据 【合并数据并复制】:可以将一个区域的数据直接复制一个单元格中 【合并区域自动换行】:可以让具有合并单元格的区域在自动换行...
  • Excel百宝箱8.0

    2011-06-07 21:32:17
    【删除工资条恢复明细表】【制作工资条】【建立分页小计】【删除分页小计】【建立图片目录】【批量导入图片(精确匹配)】【批量导入图片(模糊匹配)】【批量导入图片批注】【删除所有图片】【批量导出图片】...
  • Excel百宝箱

    2012-10-27 17:09:21
    【取消合并还原合并数据】:对一列中合并后的单元格取消合并,且恢复合并前所有数据 【合并数据并复制】:可以将一个区域的数据直接复制一个单元格中 【合并区域自动换行】:可以让具有合并单元格的区域在自动换行...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 138
精华内容 55
关键字:

查找到的单元格导出