精华内容
下载资源
问答
  • 小白最近在工作中遇到,从hive表中向服务器导出txt文档的问题,之前没有注意到一个问题: ...每次的csv文件都是覆盖上一次的结果 file_path="/home/chen" file_name_t="test.csv" hive -e "set hive.re...

           小白最近在工作中遇到,从hive表中向服务器导出txt文档的问题,之前没有注意到一个问题:

    情景一:导入到csv文件

           之前一直是将hive表中的查询结果导入到csv文件中,用下面的语句执行:

    每次的csv文件都是覆盖上一次的结果

    file_path="/home/chen"
    file_name_t="test.csv"
    hive -e "set hive.resultset.use.unique.column.names=false;set hive.cli.print.header=true; 
    select
          d,
          count(distinct orderid) as ordernum,
          sum(roomnum) as roomnum,
          sum(roomprice)as roomprice
     from table
    where d >='${zdt.addDay(-10).format("yyyy-MM-dd")}'
      and d < '${zdt.format("yyyy-MM-dd")}'
    group by d
    ;" >> $file_path/$file_name_t

    情景二:导入到txt文件

    但是,小白在将上面语句同样的,把导出文件换成txt,就出现了问题,大家可以看下有没有遇到过类似的情况

    file_path="/home/chen"
    file_name_t="test.txt"
    hive -e "set hive.resultset.use.unique.column.names=false;set hive.cli.print.header=true; 
    select
          d,
          count(distinct orderid) as ordernum,
          sum(roomnum) as roomnum,
          sum(roomprice)as roomprice
     from table
    where d >='${zdt.addDay(-10).format("yyyy-MM-dd")}'
      and d < '${zdt.format("yyyy-MM-dd")}'
    group by d
    ;" >> $file_path/$file_name_t

    结果为:what??为啥不是覆盖之前的内容??

    d ordernum roomnum roomprice
    0 2019-07-20 522538 660805 3.86531477E8
    1 2019-07-19 544145 688016 4.18172726E8
    2 2019-07-23 554484 702300 4.28929831E8
    3 2019-07-22 522778 660146 4.02876317E8
    4 2019-07-16 520617 657243 3.96917734E8
    5 2019-07-21 454326 570644 3.39250668E8
    6 2019-07-24 576412 733834 4.50772871E8
    7 2019-07-15 487305 610893 3.67915773E8
    8 2019-07-17 533549 673089 4.10751332E8
    9 2019-07-18 540329 683141 4.17467437E8
    10 d ordernum roomnum roomprice
    11 2019-07-20 522538 660805 3.86531477E8
    12 2019-07-19 544145 688016 4.18172726E8
    Traceback (most recent call last):
    13 2019-07-23 554484 702300 4.28929831E8
    14 2019-07-22 522778 660146 4.02876317E8
    15 2019-07-16 520617 657243 3.96917734E8
    16 2019-07-21 454326 570644 3.39250668E8
    17 2019-07-15 487305 610893 3.67915773E8
    18 2019-07-17 533549 673089 4.10751332E8
    19 2019-07-18 540329 683141 4.17467437E8
    20 2019-07-14 423843 523466 3.02687931E8

    遇到这个问题之后,小白在网上搜有没有相关的文档,emmm,很少有专门写这种问题的,查了很多,找到一个有点关系的解决方案,抱着试试看的想法,试了一下,竟然成功了!!

    file_path="/home/chen"
    file_name_t="test.txt"
    hive -e "set hive.resultset.use.unique.column.names=false;set hive.cli.print.header=true; 
    select
          d,
          count(distinct orderid) as ordernum,
          sum(roomnum) as roomnum,
          sum(roomprice)as roomprice
     from table
    where d >='${zdt.addDay(-10).format("yyyy-MM-dd")}'
      and d < '${zdt.format("yyyy-MM-dd")}'
    group by d
    ;" > $file_path/$file_name_t

    是的,就是最终导入的时候把两个箭头改成一个箭头就可以了。

            为了以免之后遇到类似问题的小伙伴有我一样各种查找的经历,我就总结了一下,这个方式,如果还有别的写法,欢迎大家随时交流哦~

     

    展开全文
  • StringBuffer str=new StringBuffer(names[j]); File file = new File("C:/"+str.insert(16, "SD")); if(file.exists()) { file.delete(); file.createNewFile();


    								StringBuffer str=new StringBuffer(names[j]);
    								File file = new File("C:/"+str.insert(16, "SD"));
    								if(file.exists())
    								{
    									file.delete();
    									file.createNewFile();
    								}
    								else
    								file.createNewFile();
    								

    展开全文
  • ,刚开始我也是用的是window.location,但是当文件比较大的时候,速度就很慢了,并且对前端来说太友好,可能会重复点击下载按钮。增加后台的压力。要是可以监听下载事件就好了,当用户点击下载之后,给与友好的...

    1. 简单粗暴使用XHR,不考虑IE,带下载中的灰度弹窗

      在前端使用下载功能时,最简单的就是使用a标签或者window.location.href = "";,刚开始我也是用的是window.location,但是当文件比较大的时候,速度就很慢了,并且对前端来说不太友好,可能会重复点击下载按钮。增加后台的压力。要是可以监听下载事件就好了,当用户点击下载之后,给与友好的提示。

    下面的代码没有实现进度条的提示,只给了一个load提示。

      function downloadExcel(filename, url){
          	console.log('downloadExcel........');
          	var page_url = url;
            var req;
    		if (window.XMLHttpRequest){
    			console.log("IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码");
    		    //  IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码
    		    req = new XMLHttpRequest();
    		}else{
    			console.log("IE6, IE5  浏览器执行代码");
    		    // IE6, IE5 浏览器执行代码
    		    req = new ActiveXObject("Microsoft.XMLHTTP");
    		}
            
            req.open("get", page_url, true);
            //监听进度事件   IE不兼容
            /* req.addEventListener("progress", function (evt) {
            	console.log("addEventListener.....");
            	console.log(evt);
            	console.log("evt.lengthComputable:" + evt.lengthComputable);
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total;
                    console.log("percentComplete:" + percentComplete);
                    $("#progressing").html((percentComplete * 100) + "%");
                }
            }, false); */
            req.responseType = "blob";
            req.onreadystatechange = function () {
                if (req.readyState === 4 && req.status === 200) {
                    if (typeof window.chrome !== 'undefined') {
                        // Chrome version
                        var link = document.createElement('a');
                        link.href = window.URL.createObjectURL(req.response);
                        link.download = filename;
                        link.click();
                    } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
                        // IE version
                        var blob = new Blob([req.response], { type: 'application/force-download' });
                        window.navigator.msSaveBlob(blob, filename);
                    } else {
                        // Firefox version
                        var file = new File([req.response], filename, { type: 'application/force-download' });
                        window.open(URL.createObjectURL(file));
                    }
                }
            };
            var loadIndex;
            req.onloadstart = function(event) {
    	        console.log("onloadstart()");
    	        loadIndex = layer.load(1, {
    			  shade: [0.1,'#fff'] //0.1透明度的白色背景
    			});
    	    }
            req.onloadend = function(event) {
                console.log("onloadend().......");
                //关闭加载层
    			layer.closeAll('loading');
            }
            req.onerror = function(event) {
    	        console.log("onerror()");
    	        layer.closeAll('loading');
    	        layer.alert("连接服务器失败,请联系管理员!", {title:"系统提示",icon: 2, shade: 0.2});
    	    }
            req.send();
            
       }
    

    不过这里也指定了保存的文件名称,当使用window.location的时候,我在后端代码里面已经指定了下载的文件名了,这里设置的文件名会覆盖后端设置的文件名。

    后端主要是使用流的方式输出excel文件,核心代码:

    OutputStream outputStream = null;
    try {
    	outputStream = response.getOutputStream();
    	//设置ConetentType CharacterEncoding Header,需要在excelWriter.write()之前设置
        response.setContentType("mutipart/form-data");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-disposition","attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
        BaseExcelWriter<SjsbMxWriteRowModel> excelWriter = new BaseExcelWriter<SjsbMxWriteRowModel>(outputStream, ExcelTypeEnum.XLSX, true);
    	excelWriter.consumeWrite(list, new SjsbMxExcelWriter(outputStream, ExcelTypeEnum.XLSX, true));
    	// 记得 释放资源
        excelWriter.finish();
        outputStream.flush();
        log.info("导出明细成功");
    } catch (IOException e) {
    	e.printStackTrace();
    }finally {
        try {
          	if (outputStream != null) {
          		outputStream.close();
    		}
          }catch (Exception e){
              e.printStackTrace();
          }
      }
    

    上面的java代码中主要关注response的处理就好,将流数据写到response中去。BaseExcelWriter为自定义封装的easyExcel的工具类。

    如果在req.onreadystatechange打印日志的话可以看到一次请求,req.onreadystatechange会执行好几遍,可以优化下,使用onload函数代替,在函数内判断status为200时,处理保存文件的操作。

    req.onload = function(event) {
           if (req.status === 200) {
           	console.log("filename:" + filename);
           	console.log("fileName:" + req.getResponseHeader("fileName"));
           	filename = req.getResponseHeader("fileName");
               if (typeof window.chrome !== 'undefined') {
                      // Chrome version
                      var link = document.createElement('a');
                      link.href = window.URL.createObjectURL(req.response);
                      link.download = filename;
                      link.click();
                  } else if (typeof window.navigator.msSaveBlob !== 'undefined') {
                      // IE version
                      var blob = new Blob([req.response], { type: 'application/force-download' });
                      window.navigator.msSaveBlob(blob, filename);
                  } else {
                      // Firefox version
                      var file = new File([req.response], filename, { type: 'application/force-download' });
                      window.open(URL.createObjectURL(file));
                  }
           } else {
               //其它操作
               console.log('req.status !=== 200');
           }
       }
    

    当直接下载文件时,使用:

    URLEncoder.encode(downloadFileName, "UTF-8")
    

    防止中文文件名称乱码,直接使用浏览器访问下载地址的话,下载文件名中的中文是正常的。

    对于上面下载的文件名,前后端都可定义但是感觉前端硬编码不太好,我还是想在后端定义,这时就可以用到一个函数getResponseHeader,这就是XHR的响应部分了,但是IE不支持。。。。。

    XHR响应
    了解了XHR的请求、XHR的事件回调之后,就剩下处理XHR响应的工作了,比如解析数据等等,要处理响应,需要了解下面的方法和属性。

    • getResponseHeader(ByteString name);参数name为HTTP响应头部的键值
    • getAllResponseHeaders方法可以获取所有的HTTP响应头的数据,其定义如下:
    • status和statusText属性status属性表示HTTP响应状态码,即200、404等;statusText属性表示HTTP响应状态的描述文本,即OK、Not Found等。

    可以在后端响应的头部,将文件名带回来:

     response.setHeader("Content-disposition","attachment;");
     response.setHeader("fileName",URLEncoder.encode(downloadFileName, "UTF-8"));
    

    然后在XHR的onload函数里面使用:

    req.onload = function(event) {
            if (req.status === 200) {
            	console.log("filename:" + filename);
            	console.log("fileName:" + req.getResponseHeader("fileName"));
            	filename = req.getResponseHeader("fileName");
            }
    	 }
    

    但是这样会产生中文乱码,按理说不应该是吧,因为response里面已经设置了utf-8了,不应该乱码的。

    可以看下乱码的文件名内容,是不是只有百分号和数字,这里我突然想到是不是因为浏览器默认的不是UTF-8编码??又或者是编码之后,浏览器没有解码??

    我试着把乱码的文件名复制到js里面,然后解码发现,乱码的文件名其实就是utf-8之后的文件名。对于谷歌浏览器可以直接解码得到原来的文件名。解码使用函数:decodeURI()

    		var fileName = req.getResponseHeader("fileName");
         	console.log("fileName:" + fileName);
         	//防止中文乱码,判断是否需要解码utf-8的文件名
         	console.log(fileName.indexOf('%') > -1);
         	if(fileName && fileName.indexOf('%') > -1){
         		var tempFileName = fileName.split('.');
         		console.log(tempFileName);
         		if(tempFileName.length == 2){
         			fileName = decodeURI(tempFileName[0]) + '.' + tempFileName[1];
         		}
         	}else{
         		fileName = '123456';
         	}
    

    在谷歌浏览器里面是正常的,解码得到原文件名,但是在IE里面就不好使了,直接连响应头里面的参数都拿不到。。。。。

    req.getResponseHeader("fileName");里面获取到的文件名是null。。。。。。

    关于前台往后台传值中文乱码的解决方式,可以参考这篇博客,使用两次编码:https://blog.csdn.net/acmman/article/details/47755723?utm_source=blogxgwz0

    一个文件名折腾了半天,最后也没找到完美的解决办法,最后还是使用了前端硬编码,将文件名写在前端了。。。。。。。

    这里只用了下载开始和完成的事件,更详细的使用可以参考下面的博客,里面有更详细的XMLHttpRequest的使用方法:https://blog.csdn.net/a576890883/article/details/101313227

    2. 苟一苟,直接使用window.location,不过除了保存文件外,没有别的点击提醒,不能防止重复点击。

    window.location = download_url;
    

    这种IE是正常的,如果文件很小,下载速度秒开的话,是正常的,但是文件比较大时,可能点击下载按钮之后前端没有任何反应,这种情况用户可能会多次点击下载按钮。

    3. 下载的文件名乱码或者不是后台设置的文件名

    主要是看对response的处理:

    OutputStream outputStream = null;
    		String downloadFileName = "我是下载文件名.xlsx";
    		try {
    			outputStream = response.getOutputStream();
    			//设置ConetentType CharacterEncoding Header,需要在excelWriter.write()之前设置
    			response.setCharacterEncoding("utf-8");
                response.setContentType("application/x-download;charset=utf-8");
    //            response.setContentType("mutipart/form-data;charset=utf-8");
    //            response.setHeader("Content-Disposition","attachment;");
    //            response.setHeader("fileName",URLEncoder.encode(downloadFileName, "UTF-8"));
                response.setHeader( "Content-Disposition ", "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
                //BaseExcelWriter为自定义工具类
                BaseExcelWriter<SjsbMxWriteRowModel> excelWriter = new BaseExcelWriter<SjsbMxWriteRowModel>(outputStream, ExcelTypeEnum.XLSX, true);
            	excelWriter.consumeWrite(list, new SjsbMxExcelWriter(outputStream, ExcelTypeEnum.XLSX, true));
            	// 记得 释放资源
                excelWriter.finish();
                outputStream.flush();
                log.info("导出枪支弹药明细成功");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}finally {
                try {
                	if (outputStream != null) {
                		outputStream.close();
    				}
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
    

    前面折腾了半天,最后还是改了response的头部参数,才使得下载的excel文件名正常了。

    response.setContentType("application/x-download;charset=utf-8");
    
    response.setHeader( "Content-Disposition ", "attachment;filename=" + URLEncoder.encode(downloadFileName, "UTF-8"));
    
    展开全文
  • 使用 jxls2.X 导出excel文件

    千次阅读 热门讨论 2016-10-26 11:28:09
    使用 jxls2.X 导出excel文件 2018年4月27日更新 已更新最新版本,移步到最版本 jxlss http://blog.csdn.net/lnktoking/article/details/79195500 jxls是基于POI API的Excel报表生成工具,可以更简单、灵活的生成...

    使用 jxls2.X 导出excel文件

    2018年4月27日更新
    已更新最新版本,移步到最版本 jxlss http://blog.csdn.net/lnktoking/article/details/79195500

    jxls是基于POI API的Excel报表生成工具,可以更简单、灵活的生成我们想要的Excel格式。我们只需要准备写好格式的Excel文件,在文件需要填充内容的位置加上jxls指令,然后就可以导出我们最终想要的Excel。

    注意:这里讲的是jxls2,不是jxls1。jxls2不再使用<jx:xx/>标签,改为在批注中写指令,这样模版看起来更简洁。
    

    jxls2 api首页:http://jxls.sourceforge.net/index.html
    jxls2更多的介绍请看官网和自行搜索,小弟不擅长写这些东东,请多多谅解。

    下面看例子:
    Excel模版文件
    Excel模版文件

    所有批注
    所有批注

    最终导出Excel文件效果
    最终导出Excel文件效果

    下面是项目案例
    项目结构如下
    项目结构

    下面是java代码
    Demo.java

    public class Demo {
        static byte[] imgBytes;
        static{
            try {
                InputStream ins = new FileInputStream(Demo.class.getClassLoader().getResource("img/img.jpg").getFile());
                imgBytes = IOUtils.toByteArray(ins);
                ins.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) throws FileNotFoundException, IOException {
            HashMap<String, Object> beans = new HashMap<String, Object>();
            beans.put("title", "这是标题");
            beans.put("list", getList());
            beans.put("logoImg", imgBytes);
            beans.put("startTime", new Date());
            beans.put("endTime", new Date());
            beans.put("exportTime", new Date());
            beans.put("url", "http://www.baidu.com");
            beans.put("company", "LK_King");
            File template = JxlsUtil.getTemplate("demo.xlsx");
            File out = new File("D:/out.xlsx");
            JxlsUtil.exportExcel(template, out, beans);
            System.out.println("导出成功");
        }
    
        static List<User> getList(){
            List<User> list = new ArrayList<User>();
            User zs = new User("张三");
            User ls = new User("李四");
            User ww = new User("王五");
            for (int i = 1; i <= 3; i++) {
                zs.getClients().add(new User("客户"+i, true, imgBytes));
            }
            for (int i = 1; i <= 2; i++) {
                ww.getClients().add(new User("客户"+i, false, null));
            }
            list.add(zs);
            list.add(ls);
            list.add(ww);
            return list;
        }
    }

    User.java

    public class User {
        private String name;
        private boolean sign;
        private byte[] imgBytes;
        private List<User> clients = new ArrayList<User>();
    
        public User(String name) {
            super();
            this.name = name;
        }
    
        public User(String name, boolean sign, byte[] imgBytes) {
            super();
            this.name = name;
            this.sign = sign;
            this.imgBytes = imgBytes;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public boolean getSign() {
            return sign;
        }
        public void setSign(boolean sign) {
            this.sign = sign;
        }
        public byte[] getImgBytes() {
            return imgBytes;
        }
        public void setImgBytes(byte[] imgBytes) {
            this.imgBytes = imgBytes;
        }
    
        public List<User> getClients() {
            return clients;
        }
    
        public void setClients(List<User> clients) {
            this.clients = clients;
        }
    }

    JxlsUtil.java

    public class JxlsUtil {
        static{
            //添加自定义指令(可覆盖jxls原指令)
            XlsCommentAreaBuilder.addCommandMapping("image", ImageCommand.class);
            XlsCommentAreaBuilder.addCommandMapping("each", EachCommand.class);
            XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
            XlsCommentAreaBuilder.addCommandMapping("link", LinkCommand.class);
        }
        /** jxls模版文件目录 */
        private final static String TEMPLATE_PATH = "jxlsTemplate";
        /**
         * 导出excel
         * @param is - excel文件流
         * @param os - 生成模版输出流
         * @param beans - 模版中填充的数据
         * @throws IOException 
         */
        public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> beans) throws IOException {
            Context context = new Context();
            if (beans != null) {
                for (String key : beans.keySet()) {
                    context.putVar(key, beans.get(key));
                }
            }
            JxlsHelper jxlsHelper = JxlsHelper.getInstance();
            Transformer transformer  = jxlsHelper.createTransformer(is, os);
            JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
            Map<String, Object> funcs = new HashMap<String, Object>();
            funcs.put("jx", new JxlsUtil());    //添加自定义功能
            evaluator.getJexlEngine().setFunctions(funcs);
            jxlsHelper.processTemplate(context, transformer);
        }
    
        /**
         * 导出excel
         * @param xlsPath excel文件
         * @param outPath 输出文件
         * @param beans 模版中填充的数据
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        public static void exportExcel(String xlsPath, String outPath, Map<String, Object> beans) throws FileNotFoundException, IOException {
                exportExcel(new FileInputStream(xlsPath), new FileOutputStream(outPath), beans);
        }
    
        /**
         * 导出excel
         * @param xls excel文件
         * @param out 输出文件
         * @param beans 模版中填充的数据
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        public static void exportExcel(File xls, File out, Map<String, Object> beans) throws FileNotFoundException, IOException {
                exportExcel(new FileInputStream(xls), new FileOutputStream(out), beans);
        }
        /**
         * 获取jxls模版文件
         */
        public static File getTemplate(String name){
            String templatePath = JxlsUtil.class.getClassLoader().getResource(TEMPLATE_PATH).getPath();
            File template = new File(templatePath, name);
            if(template.exists()){
                return template;
            }
            return null;
        }
    
        // 日期格式化
        public String dateFmt(Date date, String fmt) {
            if (date == null) {
                return null;
            }
            try {
                SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
                return dateFmt.format(date);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        // 返回第一个不为空的对象
        public Object defaultIfNull(Object... objs) {
            for (Object o : objs) {
                if (o != null)
                    return o;
            }
            return null;
        }
    
        // if判断
        public Object ifelse(boolean b, Object o1, Object o2) {
            return b ? o1 : o2;
        }
    }

    EachCommand.java

    /**
     * 扩展jxls each命令
     * 增加retainEmpty属性,当items为null或size为0时,也保留当前一行数据的格式
     * 循环增加下标变量“var_index”。如var="item",获取下标方法:${item_index}
     */
    public class EachCommand extends AbstractCommand {
        public enum Direction {RIGHT, DOWN}
    
        private String var;
        private String items;
        private String select;
        private Area area;
        private Direction direction = Direction.DOWN;
        private CellRefGenerator cellRefGenerator;
        private String multisheet;
    
        private String retainEmpty; //当集合大小为0时,是否最少保留一行空行数据
    
        public EachCommand() {
        }
    
        /**
         * @param var       name of the key in the context to contain each collection items during iteration
         * @param items     name of the collection bean in the context
         * @param direction defines processing by rows (DOWN - default) or columns (RIGHT)
         */
        public EachCommand(String var, String items, Direction direction) {
            this.var = var;
            this.items = items;
            this.direction = direction == null ? Direction.DOWN : direction;
        }
    
        public EachCommand(String var, String items, Area area) {
            this(var, items, area, Direction.DOWN);
        }
    
        public EachCommand(String var, String items, Area area, Direction direction) {
            this(var, items, direction);
            if (area != null) {
                this.area = area;
                addArea(this.area);
            }
        }
    
        /**
         * @param var              name of the key in the context to contain each collection items during iteration
         * @param items            name of the collection bean in the context
         * @param area             body area for this command
         * @param cellRefGenerator generates target cell ref for each collection item during iteration
         */
        public EachCommand(String var, String items, Area area, CellRefGenerator cellRefGenerator) {
            this(var, items, area, (Direction) null);
            this.cellRefGenerator = cellRefGenerator;
        }
    
        /**
         * Gets iteration directino
         *
         * @return current direction for iteration
         */
        public Direction getDirection() {
            return direction;
        }
    
        /**
         * Sets iteration direction
         *
         * @param direction
         */
        public void setDirection(Direction direction) {
            this.direction = direction;
        }
    
        public void setDirection(String direction) {
            this.direction = Direction.valueOf(direction);
        }
    
        /**
         * Gets defined cell ref generator
         *
         * @return current {@link CellRefGenerator} instance or null
         */
        public CellRefGenerator getCellRefGenerator() {
            return cellRefGenerator;
        }
    
        public void setCellRefGenerator(CellRefGenerator cellRefGenerator) {
            this.cellRefGenerator = cellRefGenerator;
        }
    
        public String getName() {
            return "each";
        }
    
        /**
         * Gets current variable name for collection item in the context during iteration
         *
         * @return collection item key name in the context
         */
        public String getVar() {
            return var;
        }
    
        /**
         * Sets current variable name for collection item in the context during iteration
         *
         * @param var
         */
        public void setVar(String var) {
            this.var = var;
        }
    
        /**
         * Gets collection bean name
         *
         * @return collection bean name in the context
         */
        public String getItems() {
            return items;
        }
    
        /**
         * Sets collection bean name
         *
         * @param items collection bean name in the context
         */
        public void setItems(String items) {
            this.items = items;
        }
    
        /**
         * Gets current 'select' expression for filtering out collection items
         *
         * @return current 'select' expression or null if undefined
         */
        public String getSelect() {
            return select;
        }
    
        /**
         * Sets current 'select' expression for filtering collection
         *
         * @param select filtering expression
         */
        public void setSelect(String select) {
            this.select = select;
        }
    
        /**
         * @return Context variable name holding a list of Excel sheet names to output the collection to
         */
        public String getMultisheet() {
            return multisheet;
        }
    
        /**
         * Sets name of context variable holding a list of Excel sheet names to output the collection to
         * @param multisheet
         */
        public void setMultisheet(String multisheet) {
            this.multisheet = multisheet;
        }
    
        @Override
        public Command addArea(Area area) {
            if (area == null) {
                return this;
            }
            if (super.getAreaList().size() >= 1) {
                throw new IllegalArgumentException("You can add only a single area to 'each' command");
            }
            this.area = area;
            return super.addArea(area);
        }
    
        @SuppressWarnings("rawtypes")
        public Size applyAt(CellRef cellRef, Context context) {
            Collection itemsCollection = Util.transformToCollectionObject(getTransformationConfig().getExpressionEvaluator(), items, context);
            int width = 0;
            int height = 0;
            int index = 0;
            CellRefGenerator cellRefGenerator = this.cellRefGenerator;
            if (cellRefGenerator == null && multisheet != null) {
                List<String> sheetNameList = extractSheetNameList(context);
                cellRefGenerator = new SheetNameGenerator(sheetNameList, cellRef);
            }
            CellRef currentCell = cellRefGenerator != null ? cellRefGenerator.generateCellRef(index, context) : cellRef;
            JexlExpressionEvaluator selectEvaluator = null;
            if (select != null) {
                selectEvaluator = new JexlExpressionEvaluator(select);
            }
            for (Object obj : itemsCollection) {
                context.putVar(var, obj);
                context.putVar(var+"_index", index);
                if (selectEvaluator != null && !Util.isConditionTrue(selectEvaluator, context)) {
                    context.removeVar(var);
                    context.removeVar(var+"_index");
                    continue;
                }
                Size size = area.applyAt(currentCell, context);
                index++;
                if (cellRefGenerator != null) {
                    width = Math.max(width, size.getWidth());
                    height = Math.max(height, size.getHeight());
                    if(index < itemsCollection.size()) {
                        currentCell = cellRefGenerator.generateCellRef(index, context);
                    }
                } else if (direction == Direction.DOWN) {
                    currentCell = new CellRef(currentCell.getSheetName(), currentCell.getRow() + size.getHeight(), currentCell.getCol());
                    width = Math.max(width, size.getWidth());
                    height += size.getHeight();
                } else {
                    currentCell = new CellRef(currentCell.getSheetName(), currentCell.getRow(), currentCell.getCol() + size.getWidth());
                    width += size.getWidth();
                    height = Math.max(height, size.getHeight());
                }
                context.removeVar(var);
                context.removeVar(var+"_index");
            }
            if("true".equalsIgnoreCase(retainEmpty) && width == 0 && height == 0){
                return area.applyAt(currentCell, context);
            }
            return new Size(width, height);
        }
    
        @SuppressWarnings("unchecked")
        private List<String> extractSheetNameList(Context context) {
            try {
                return (List<String>) context.getVar(multisheet);
            } catch (Exception e) {
                throw new JxlsException("Failed to get sheet names from " + multisheet, e);
            }
        }
    
        public String getRetainEmpty() {
            return retainEmpty;
        }
    
        public void setRetainEmpty(String retainEmpty) {
            this.retainEmpty = retainEmpty;
        }
    
    }

    ImageCommand.java

    /**
     * 解决图片最少占4个单元格才显示的问题并保留原来单元格样式
     */
    public class ImageCommand extends AbstractCommand {
    
        private byte[] imageBytes;
        private ImageType imageType = ImageType.PNG;
        private Area area;
        /**
         * Expression that can be evaluated to image byte array byte[]
         */
        private String src;
        private String text; //无法读取图片时的提示
    
        public ImageCommand() {
        }
    
        public ImageCommand(String image, ImageType imageType) {
            this.src = image;
            this.imageType = imageType;
        }
    
        public ImageCommand(byte[] imageBytes, ImageType imageType) {
            this.imageBytes = imageBytes;
            this.imageType = imageType;
        }
    
        /**
         * @return src expression producing image byte array
         */
        public String getSrc() {
            return src;
        }
    
        /**
         * @param src expression resulting in image byte array
         */
        public void setSrc(String src) {
            this.src = src;
        }
    
        public void setImageType(String strType){
            imageType = ImageType.valueOf(strType);
        }
    
        @Override
        public Command addArea(Area area) {
            if( super.getAreaList().size() >= 1){
                throw new IllegalArgumentException("You can add only a single area to 'image' command");
            }
            this.area = area;
            return super.addArea(area);
        }
    
        public String getName() {
            return "image";
        }
    
        public Size applyAt(CellRef cellRef, Context context) {
            if( area == null ){
                throw new IllegalArgumentException("No area is defined for image command");
            }
            Transformer transformer = getTransformer();
            Size size = area.getSize();
            //获取图片显示区域是时候,多加一行和一列,获取完之后再恢复原来大小
            size.setWidth(size.getWidth() + 1);
            size.setHeight(size.getHeight() + 1);
            AreaRef areaRef = new AreaRef(cellRef, size);
            size.setWidth(size.getWidth() - 1);
            size.setHeight(size.getHeight() - 1);
            byte[] imgBytes = imageBytes;
            if( src != null ){
                Object imgObj = getTransformationConfig().getExpressionEvaluator().evaluate(src, context.toMap());
                if(imgObj != null){
                    if( !(imgObj instanceof byte[]) ){
                        throw new IllegalArgumentException("src value must contain image bytes (byte[])");
                    }
                    imgBytes = (byte[]) imgObj;
                }
            }
            if(imgBytes != null){
                transformer.addImage(areaRef, imgBytes, imageType);
            }
            area.applyAt(cellRef, context); //恢复原有的样式
            if(imgBytes == null && StringUtils.isNotBlank(text)){
                PoiTransformer poi = (PoiTransformer)transformer;
                Sheet sheet = poi.getWorkbook().getSheet(cellRef.getSheetName());
                Row row = sheet.getRow(cellRef.getRow());
                if(row != null && row.getCell(cellRef.getCol()) != null){
                    row.getCell(cellRef.getCol()).setCellValue(text);
                }
            }
            return size;
        }
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    }
    

    LinkCommand.java

    /**
     * url超链接
     */
    public class LinkCommand extends AbstractCommand {
        private String url;     //url地址(必选)
        private String title;   //url显示标题(可选)
        private Area area;
    
        @Override
        public String getName() {
            return "link";
        }
    
        @Override
        public Command addArea(Area area) {
            if (super.getAreaList().size() >= 1) {
                throw new IllegalArgumentException("You can add only a single area to 'link' command");
            }
            this.area = area;
            return super.addArea(area);
        }
    
        @Override
        public Size applyAt(CellRef cellRef, Context context) {
            if(StringUtils.isBlank(url)){
                throw new NullPointerException("url不能为空");
            }
            area.applyAt(cellRef, context);
            Transformer transformer = this.getTransformer();
            if(transformer instanceof PoiTransformer){
                poiLink(cellRef, context, (PoiTransformer)transformer);
            }else if(transformer instanceof JexcelTransformer){
                jxcelLink(cellRef, context, (JexcelTransformer)transformer);
            }
            return new Size(1, 1);
        }
    
        protected void poiLink(CellRef cellRef, Context context, PoiTransformer transformer){
            Object urlObj = getTransformationConfig().getExpressionEvaluator().evaluate(url, context.toMap());
            if(urlObj == null)
                return;
    
            String url = urlObj.toString();
            String title = url;
            if(StringUtils.isNotBlank(this.title)){
                Object titleObj = getTransformationConfig().getExpressionEvaluator().evaluate(this.title, context.toMap());
                if(titleObj != null)
                    title = titleObj.toString();
            }
    
            Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
            Row row = sheet.getRow(cellRef.getRow());
            if(row == null){
                row = sheet.createRow(cellRef.getRow());
            }
            Cell cell = row.getCell(cellRef.getCol());
            if(cell == null){
                cell = row.createCell(cellRef.getCol());
            }
            cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
            cell.setCellFormula("HYPERLINK(\"" + url+ "\",\"" + title + "\")");
            if(!url.equals(title)){
                cell.setCellValue(title);
            }
    
            CellStyle linkStyle = cell.getCellStyle();
            Font cellFont= transformer.getWorkbook().createFont();
            cellFont.setUnderline((byte) 1);
            cellFont.setColor(HSSFColor.BLUE.index);
            linkStyle.setFont(cellFont);
        }
    
        protected void jxcelLink(CellRef cellRef, Context context, JexcelTransformer transformer){
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
    }

    MergeCommand.java

    
    /**
     * @author lk
     * 合并单元格命令
     */
    public class MergeCommand extends AbstractCommand {
        private String cols;    //合并的列数
        private String rows;    //合并的行数
        private Area area;
        private CellStyle cellStyle;    //第一个单元格的样式
    
        @Override
        public String getName() {
            return "merge";
        }
    
        @Override
        public Command addArea(Area area) {
            if (super.getAreaList().size() >= 1) {
                throw new IllegalArgumentException("You can add only a single area to 'merge' command");
            }
            this.area = area;
            return super.addArea(area);
        }
    
        @Override
        public Size applyAt(CellRef cellRef, Context context) {
            int rows = 1, cols = 1;
            if(StringUtils.isNotBlank(this.rows)){
                Object rowsObj = getTransformationConfig().getExpressionEvaluator().evaluate(this.rows, context.toMap());
                if(rowsObj != null && NumberUtils.isDigits(rowsObj.toString())){
                    rows = NumberUtils.toInt(rowsObj.toString());
                }
            }
            if(StringUtils.isNotBlank(this.cols)){
                Object colsObj = getTransformationConfig().getExpressionEvaluator().evaluate(this.cols, context.toMap());
                if(colsObj != null && NumberUtils.isDigits(colsObj.toString())){
                    cols = NumberUtils.toInt(colsObj.toString());
                }
            }
    
            if(rows > 1 || cols > 1){
                Transformer transformer = this.getTransformer();
                if(transformer instanceof PoiTransformer){
                    return poiMerge(cellRef, context, (PoiTransformer)transformer, rows, cols);
                }else if(transformer instanceof JexcelTransformer){
                    return jexcelMerge(cellRef, context, (JexcelTransformer)transformer, rows, cols);
                }
            }
            area.applyAt(cellRef, context);
            return new Size(1, 1);
        }
    
        protected Size poiMerge(CellRef cellRef, Context context, PoiTransformer transformer, int rows, int cols){
            Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
            CellRangeAddress region = new CellRangeAddress(
                    cellRef.getRow(), 
                    cellRef.getRow() + rows - 1, 
                    cellRef.getCol(), 
                    cellRef.getCol() + cols - 1);
            sheet.addMergedRegion(region);
    
            //合并之后单元格样式会丢失,以下操作将合并后的单元格恢复成合并前第一个单元格的样式
            area.applyAt(cellRef, context);
            if(cellStyle == null){
                PoiCellData cellData = (PoiCellData)transformer.getCellData(cellRef);
                cellStyle = cellData.getCellStyle();
            }
            setRegionStyle(cellStyle, region, sheet);
            return new Size(cols, rows);
        }
    
        protected Size jexcelMerge(CellRef cellRef, Context context, JexcelTransformer transformer, int rows, int cols){
            try {
                transformer.getWritableWorkbook().getSheet(cellRef.getSheetName())
                    .mergeCells(
                            cellRef.getRow(), 
                            cellRef.getCol(), 
                            cellRef.getRow() + rows - 1 , 
                            cellRef.getCol() + cols - 1);
                area.applyAt(cellRef, context);
            } catch (WriteException e) {
                throw new IllegalArgumentException("合并单元格失败");
            }
            return new Size(cols, rows);
        }
    
        private static void setRegionStyle(CellStyle cs, CellRangeAddress region, Sheet sheet) {
            for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
                Row row = sheet.getRow(i);
                if (row == null)
                    row = sheet.createRow(i);
                for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
                    Cell cell = row.getCell(j);
                    if (cell == null) {
                        cell = row.createCell(j);
                    }
                    cell.setCellStyle(cs);
                }
            }
        }
    
        public String getCols() {
            return cols;
        }
    
        public void setCols(String cols) {
            this.cols = cols;
        }
    
        public String getRows() {
            return rows;
        }
    
        public void setRows(String rows) {
            this.rows = rows;
        }
    }
    

    项目源码下载
    jxls 2.3.0下载
    项目所依赖的jar包下载

    展开全文
  • Matlab文件和数据的导入与导出

    万次阅读 2017-06-01 16:20:46
    Matlab文件和数据的导入与导出 本文来源于网上 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍MATLAB中文件的读写和数据的导入导出...
  • 使用jxls2.X导出excel文件

    千次阅读 2017-05-05 17:31:09
    使用 jxls2.X 导出excel文件 jxls是基于POI API的Excel报表生成工具,可以更简单、灵活的生成我们想要的Excel格式。我们只需要准备写好格式的Excel文件,在文件需要填充内容的位置加上jxls指令,然后就可以导出...
  • unity 代码有调整,重新导出 iOS 最烦的就是 覆盖导出后项目不能打开,原因是 editor 里面的脚本,破坏了 Unity-iPhone.xcodeproj 里面的结构,具体是什么原因,也不想查了... 这里找到了另外一个办法和Android类似...
  • 大量数据导出为Excel文件的问题解决

    千次阅读 2013-07-04 10:45:13
    大量数据导出为Excel文件的问题解决(C#,ASP.NET) 依据SZW朋友的提醒:本文所说的Excel文件指.xls文件,包括Excel2007的默认保存文档格式. 大量数据导出到Excel文件,一般情况有以下三个麻烦: 1.导出的执行...
  • C#导出pdf文件《一》

    千次阅读 2012-06-20 16:45:16
    要用本文的方法生成PDF文件,需要两个控件:itextsharp.dll和ICSharpCode.SharpZipLib.dll,由于示例代码实在太多,我将代码全部整理出来,放在另外一个文件“示例代码.doc”中,所有这些资源,我均放在了本人的ftp...
  • 使用python将mysql数据导出为excel文件

    千次阅读 2020-02-17 19:52:24
    具体的说明就说了,直接上代码: #!/usr/bin/env python #-*- coding:utf-8 -*- ''' @Time : 2020/2/17 @Author : Frank Su @File : mysqlToExcel.py ''' # 从数据库中导出数据到excel数据表中 import xlwt import...
  • 在Python中我们在项目中会用到各种库,自带的自然不必再说,然而如果是三方库,则在进行项目移植时通常需要在新的环境下安装需要的三方库文件,面对较大项目中众多的三方库,可以先将项目依赖库导出到txt文件中, ...
  • **linux服务器**,从备份的dmp文件中,导出表A01(不是所有的表,不是dmp文件),并导入到现在的oracle
  • try { //true不覆盖已有内容 fos = new FileOutputStream(fileFullPath, true); //写入 fos.write(content.getBytes()); // 写入一个换行 fos.write("\r\n".getBytes()); } catch (IOException e) { e....
  • Oracle数据导入导出imp/exp?批处理文件   如何写批处理文件自动将数据导入oracle数据库 Oracle数据库的自动导入与导出,在许多地方有广泛的应用.例如:一个Oracle数据库应用系统开发结 束后,如果要将系统...
  • MATLAB中文件的读写和数据的导入导出【转】 在编写一个程序时,经常需要从外部读入数据,或者将程序运行的结果保存为文件。MATLAB使用多种格式打开和保存数据。本章将要介绍 MATLAB中文件的读写和数据的...
  • Apache POI项目是用于基于Microsoft的OLE 2复合文档格式开发文件格式的纯Java端口的主项目。 本章主要使用excel相关操作: HSSF是对Microsoft Excel 97(-2003)文件格式(BIFF8)操作的纯Java API。 XSSF是...
  • 业务场景是需要想后台传一些检索的参数, 后台返回对应的查到的数据生成excel文件,然后通过文件流的方式交给前台。 第一种方法。 我这边想到的两种办法第一种是,因为是接口是get类型,所以最简单的就是window....
  • JAVA ITEXT5 导出为PDF(二) 在已有的PDF文件中添加水印
  • pandas进行写入excel的时候会出现后面覆盖前面数据的情况 writer = pd.ExcelWriter('大众.xlsx') df1.to_excel(writer,"配置") df2.to_excel(writer,"外观") df3.to_excel(writer,"内饰") writer.save() ...
  • 如何用JAVA实现文件覆盖

    万次阅读 2012-10-26 12:41:27
    其中“覆盖”是指清除原文件的内容,写入新的内容,默认采用该种形式写文件,“追加”是指在已有文件的末尾写入内容,保留原来的文件内容,例如写日志文件时,一般采用追加。在实际使用时可以根据需要采用适合的形式...
  • 作者:Mike Driscoll ;翻译:季洋;校对:丁楠雅本文约4000字,建议阅读10分钟。本文介绍了在提取出想要的数据之后,如何将数据导出成其他格式的方法。有很多时...
  • 这几天学io,总发现一个问题,如果对一个已经存在的文件源用输出流对其再进行写的操作时,会覆盖掉原有文件的内容,而这里用a.txt举例,a.txt是已经存在的一个文件,并且里面有内容↓ 此时我们不管是使用字节...
  • 采用to_csv保存数据不覆盖原有数据到文件中 df.to_csv(date+’.csv’,index = False,header=0,mode=‘a’) 关键是 mode参数 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown...
  • 这里说的MySql恢复数据库,是指没有通过正常备份的情况下,通过Mysql保存的数据文件如何恢复数据库
  • 本文为摘自CSDN论坛帖子收集整理后汇总版本:---2004年9月3日整理---贴见:http://community.csdn.net/Expert/topic/3328/3328715.xml?temp=8.050799E-04鉴于现在很多朋友询问 pb 数据导出到excel 中的问题,导...
  • 下载文件时 文件名相同会被覆盖:以下是两种重命名文件的方法,妈蛋的函数写错了,让我整了一早上:第一种 利用strcpy函数,随机数参数化文件名会使文件每次生成的文件名 随机带上不同的数字strcpy(filepath,lr_eval...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,736
精华内容 9,094
关键字:

导出文件不能覆盖原文件