精华内容
下载资源
问答
  • 目前项目有一需求“数据的离线导入导出”,需要将数据分模块导入到不同的excel,然后压缩成数据包下载
  • 主要为大家详细介绍了Java多文件以ZIP压缩包导出的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java读取Excel表中的内容,可以读取多个sheet,生成自定义格式的xml文件
  • 今天小编就为大家分享一篇解决Java导入excel大量数据出现内存溢出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java多线程读取多个文件 导入数据库

    万次阅读 2016-10-14 16:59:21
    多个线程读文件和单个线程读文件,效率差不多,甚至可能不如单线程,原因如下:如果只是单纯的读文件,一个线程足够了,因为一般瓶颈是在磁盘io上,多个线程只会在磁盘io上阻塞。因为不同文件的读写,会造成磁头的...

    近期在做java读文件的项目,由于数据量较大,因此研究了一下多线程,总结了一下:

    一. 多个线程读文件和单个线程读文件,效率差不多,甚至可能不如单线程,原因如下:

    如果只是单纯的读文件,一个线程足够了,因为一般瓶颈是在磁盘io上,多个线程只会在磁盘io上阻塞。因为不同文件的读写,会造成磁头的频繁转换,磁头的频繁转换要比读取磁盘的时间更长。

    但是一般是读一小块做一次处理,然后再读下一块,这样只用一个线程磁盘io有空闲的时间,就可以用多线程处理,有的线程在读数据有的线程在处理数据。而且磁盘是有缓存的,一次读48行,可能会缓存后面的1m内容,下n次其他线程来读的时候磁盘可以直接从缓存中取数据。估计线程数不会超过10个,太多线程仍然会阻塞在磁盘io上。但是随机读取文件无法利用缓存机制,而且硬盘不断的重新定位会花费大量的寻道时间,估计效率还比不上多个线程用同一个指针顺序读取文件。理论推测,具体还是得自己写程序跑一下。(原文链接:http://www.zhihu.com/question/20149395/answer/14136499)

    二. 所以这种情况下,最好有个线程去读取文件,其他的线程去处理文件数据中的业务逻辑处理(参考:http://www.dewen.net.cn/q/1334)

    解决方案:
    (1)首先,开辟一个Reader线程, 该线程负责读取文件,将读取记录存入队列中(LinkedBlockingQueue 或者 ArrayBlockingQueue)

    ArrayBlockingQueue跟LinkedBlockingQueue的区别:

    • 队列中的锁的实现不同
      ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁;
      LinkedBlockingQueue中的锁是分离的,即生产用的是putLock,消费是takeLock

    • 在生产或消费时操作不同
      ArrayBlockingQueue基于数组,在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例;
      LinkedBlockingQueue基于链表,在生产和消费的时候,需要把枚举对象转换为Node进行插入或移除,会生成一个额外的Node对象,这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。

    • 队列大小初始化方式不同
      ArrayBlockingQueue是有界的,必须指定队列的大小;
      LinkedBlockingQueue是无界的,可以不指定队列的大小,但是默认是Integer.MAX_VALUE。当然也可以指定队列大小,从而成为有界的。

    注意:
    在使用LinkedBlockingQueue时,若用默认大小且当生产速度大于消费速度时候,有可能会内存溢出。

    在使用ArrayBlockingQueue和LinkedBlockingQueue分别对1000000个简单字符做入队操作时,
    LinkedBlockingQueue的消耗是ArrayBlockingQueue消耗的10倍左右,
    即LinkedBlockingQueue消耗在1500毫秒左右,而ArrayBlockingQueue只需150毫秒左右。

    按照实现原理来分析,ArrayBlockingQueue完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea之所以没这样去做,也许是因为ArrayBlockingQueue的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。

    (2)再开辟若干个线程,负责从队列中取数据,并插入数据库中

    (3)Reader线程读取完成后,应“通知”处理线程,当处理线程处理完队列的记录,并发现Reader线程已终止的时候,就停止了。
    (参考:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-termination)
    终止线程的三种方法

    • 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止(一般线程中的任务是放在一个循环中,需要退出时只需破坏循环的条件,退出循环即可)。
    • 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。
    • 使用interrupt方法中断线程。

    批量读文件入库程序可参考:
    http://blog.csdn.net/u010323023/article/details/52403046?locationNum=5

    一对多实例(参考链接:http://lucky-xingxing.iteye.com/blog/2054071):

    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.LinkedBlockingQueue;
    
    /**
     * Created with IntelliJ IDEA.
     * Date: 4/24/14
     * Time: 9:56 AM
     * To change this template use File | Settings | File Templates.
     *
     * 生产者与消费者模型中,要保证以下几点:
     * 1 同一时间内只能有一个生产者生产
     * 2 同一时间内只能有一个消费者消费
     * 3 生产者生产的同时消费者不能消费
     * 4 消费者消费的同时生产者不能生产
     * 5 共享空间空时消费者不能继续消费
     * 6 共享空间满时生产者不能继续生产
     *
     * 使用并发库中的BlockingQueue(阻塞队列) 实现生产者与消费者
     */
    public class WaitNoticeDemo {
        public static void main(String[] args) {
    
            //固定容器大小为10
            BlockingQueue<Food> foods = new LinkedBlockingQueue<Food>(100);
    
            boolean completeFlag = false;
    
            Thread produce = new Thread(new Produce(foods));
            Thread consume1 = new Thread(new Consume(foods));
            Thread consume2 = new Thread(new Consume(foods));
            produce.start();
            consume1.start();
            consume2.start();
    
    
        }
    }
    
    /**
     * 生产者
     */
    class Produce implements Runnable{
        private BlockingQueue<Food> foods;
        private Integer count = 0;
        private boolean exitFlag = false;
        Produce(BlockingQueue<Food> foods) {
            this.foods = foods;
        }
    
        //@Override
        public void run() {
            int i = 0;
            while (i<50){
                try {
                    //当生产的食品数量装满了容器,那么在while里面该食品容器(阻塞队列)会自动阻塞  wait状态 等待消费
                    foods.put(new Food("食品"+i));
                    i++;
                    if(i == 50){
                        foods.put(new Food("end"));
    
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
            }//while
    
            System.out.println("生产者线程结束");
        }
    }
    
    /**
     * 消费者
     */
    class Consume implements Runnable {
        private BlockingQueue<Food> foods;
        private boolean flag = true;
    
        Consume(BlockingQueue<Food> foods){
            this.foods = foods;
        }
        //@Override
        public void run() {
            System.out.println("消费者线程 - " + Thread.currentThread().getName() + "启动");
            long start = System.currentTimeMillis(); // 记录起始时间
            try {
                //Thread.sleep(3);  //用于测试当生产者生产满10个食品后是否进入等待状态
                while (flag){
                    //当容器里面的食品数量为空时,那么在while里面该食品容器(阻塞队列)会自动阻塞  wait状态 等待生产
                    Food food = foods.take();
                    System.out.println(Thread.currentThread().getName() + "消费"+food.getName());
    
                    if(("end").equals(food.getName())){
                           flag = false;
                           foods.put(food);//将结束标志放进队列  以防别的消费者线程看不到
    
                          long end = System.currentTimeMillis(); // 记录起始时间
                          System.out.println("execuete time : " + (end-start));
                    }
    
                }//while
    
                System.out.println("消费者线程结束");
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }
    
    /**
     * 食品
     */
    class Food{
        private String name;
    
        String getName() {
            return name;
        }
    
        Food(String name){
            this.name = name;
            System.out.println("生产"+name);
        }
    }
    
    

    三. 最近碰到csv文件上传存入数据库后,数据库存储空间远大于实际文件大小的情况,以下是针对该种情况的解决方案:
    1. 设置的字段类型、长度尽可能和文件中对应字段接近;
    2. 不要CHAR, 多用VARCHAR,在数据量比较大时,VARCHAR的优势特别明显。

    四. 对于处理大数据量的记录,并将处理结果写入文件中的处理方案:
    方案一(适合于处理和输出的数据量都很大的情况):
    生产者:多个线程 读取一定量的数据并处理,然后将处理结果封装成一个队列元素,装进阻塞队列中
    消费者: 一个线程 取元素 追加写文件(csv) (多个线程写文件是不安全的)

    方案二(目前在使用的,适用于需要处理的数据量大,但输出的数据量不大的情况):
    生产者:一个线程,分页查询部分数据,将其封装成队列元素装进队列中
    消费者:多个线程 ,从队列中取出数据元素并处理,存储处理结果。
    生产者和消费者执行完毕后,再集中将消费者处理的结果一个个输出到相应文件中

    五. 数据记录验证问题
    对于用数据库中的一个数据表验证另一个数据表中数据的情况,应采用SQL连接查询(适用于待验证和标准数据都在数据库的情况);

    而对于用数据库中的一个数据表验证文件中的数据记录的情况,则需要首先根据某些关键字从数据库中查出相关记录,然后在内存中进行数据的验证处理工作,避免多次访问数据库(适用于待验证数据不多,而验证的标准数据很多的情况)。

    六.文件字符串长度大于数据库规定长度时,截断处理
    数据库中 nchar (nvarchar)类型中文字符和英文字符长度都为1,nchar(10)的字段可以存放十个中英文字符,而char(varchar)类型中文字符长度为2,,英文字符长度为1,char(10)的字段可以存放五个中文字符,10个英文字符。

    针对char类型,中文字符长度为2,英文字符长度为1的情况,计算字符串长度和对字符串截断处理的代码如下:

    // 判断一个字符是否是中文
        public static boolean isChineseChar(char c) {
            return c >= 0x4E00 &&  c <= 0x9FA5;// 根据字节码判断
        }
    
        //20170302 针对数据库varchar类型 计算字符串长度:中文字符数*2 + 英文字符数<= 数据库字段设定长度
        // 判断一个字符串是否含有中文
        public static Integer getDBStrLength(String str) {
           Integer len = 0;
           if(str != null && str.length()>0){
               char[] arr = str.toCharArray();
               for(int i=0; i<arr.length; i++){
                   if(isChineseChar(arr[i])){
                        len += 2;
                   }else{
                       len += 1;
                   }
               }//for
           }
    
           return len;
        }
    
        //20170302 针对数据库varchar类型 根据字符串长度以及长度限制  对字符串进行截断处理
        public static String getTruncateStrByMaxLength(String str,Integer maxLen) {
            String result = "";
            Integer len = 0;
            if(str != null && str.length()>0){
                char[] arr = str.toCharArray();
                for(int i=0; i<arr.length; i++){
                    if(isChineseChar(arr[i])){
                        len += 2;
                    }else{
                        len += 1;
                    }
                    if(len <= maxLen){
                         result += arr[i];
                    }else{
                        break;
                    }
                }//for
            }
    
            return result;
        }
    展开全文
  • 一次选择多个文件实现上传功能。 采用uploadify struts2
  • java 实现sheet页导入

    千次阅读 2019-04-30 10:19:59
     // 读取多个sheet页面方法  private static Map, List<List<String>>> moreSheetImport(String filePath) throws Exception {  Map, List<List<String>>> tempMap = new HashMap();  File file = new File...
       //根据03还是07版本的Excel创建不同wb对象
         public static Workbook getWorkbook(InputStream inStr, String filePath) throws Exception {
            Workbook wb = null;
            String fileType = filePath.substring(filePath.lastIndexOf("."));
            System.out.println(fileType);
            if (".xls".equals(fileType)) {
                wb = new HSSFWorkbook(inStr); // 2003-
            } else if (".xlsx".equals(fileType)) {
                wb = new XSSFWorkbook(inStr); // 2007+
            } else {
                throw new Exception("解析的文件格式有误!");
            }
            return wb;
        }
    
        // 读取多个sheet页面方法
        private static Map<String, List<List<String>>> moreSheetImport(String filePath) throws Exception {
            Map<String, List<List<String>>> tempMap = new HashMap<>();
            File file = new File(filePath);
            InputStream is = new FileInputStream(file);
            Workbook wb = getWorkbook(is,filePath);
            int sheetNum = wb.getNumberOfSheets();
            for (int j = 0; j < sheetNum; j++) {
                List<List<String>> lists = new ArrayList<List<String>>();
                Sheet sheet = wb.getSheetAt(j);
                int rowstart = sheet.getFirstRowNum();
                int rowEnd = sheet.getLastRowNum();
                for (int i = rowstart; i <= rowEnd; i++) {// 从第一行表头开始读
                    Row xssRow = sheet.getRow(i);
                    if (null == xssRow)
                        continue;
                    int cellStart = xssRow.getFirstCellNum();
                    if (cellStart > -1) {
                        int cellEnd = xssRow.getLastCellNum() - 1;//因为总大1,减去
                        List<String> listmini = new ArrayList<String>();
                        for (int k = cellStart; k <= cellEnd; k++) {
                            Cell cell = xssRow.getCell(k);
                            String value = getCellStringValue(cell);
                            listmini.add(value);
                        }
                        if (listmini.size() != 0) {
                            lists.add(listmini);
                        }
                    }
                }
                tempMap.put(String.valueOf(j), lists);
            }
            System.out.println(tempMap);
            return tempMap;
        }
    

     

    展开全文
  • java实现word的合并,jdk版本1.7,直接导入eclipse中即可。基于docx4j3.3.3实现。内含所有jar包,MargeDoc中含有主方法
  • java导入word文档

    千次阅读 2019-04-12 11:31:09
    Word文档分为两种格式,.doc和OOXML规范的.docx,在poi中也有相应的类包处理。 而doc文件的格式一般都不为2003版的doc文件格式,可能为rtf、xml等格式。 Maven依赖 <!-- ...

    Word文档分为两种格式,.doc和OOXML规范的.docx,在poi中也有相应的类包处理。

    而doc文件的格式一般都不为2003版的doc文件格式,可能为rtf、xml等格式。

    Maven依赖

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->

    <dependency>

      <groupId>org.apache.poi</groupId>

      <artifactId>poi-scratchpad</artifactId>

      <version>4.0.1</version>

    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->

    <dependency>

      <groupId>org.apache.poi</groupId>

      <artifactId>poi-ooxml</artifactId>

      <version>4.0.1</version>

    </dependency>

     

    对docx文件读取

    File docFile = new File("d://a.docx");

    FileInputStream fis = new FileInputStream(docFile);

    XWPFDocument xdoc = new XWPFDocument(fis);

    XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);

    String result = extractor.getText();

    logger.info(result);

     

    对docx里面图片的获取测试

    try {

        File docFile = new File("d://a.docx");

        FileInputStream fis = new FileInputStream(docFile);

        XWPFDocument xdoc = new XWPFDocument(fis);

        byte[] bytes = xdoc.getAllPictures().get(0).getData();

        OutputStream os = new FileOutputStream("d://a.png");

        int len = 0;

        int count = 0;

        while (bytes.length / 4096 > count) {

            os.write(bytes, 4096 * count++, 4096);

        }

        os.close();

    } catch (IOException e) {

        e.printStackTrace();

    }

     

     

    对doc文件读取

     

    File docFile = new File("d://abc.doc");

     FileInputStream fis = new FileInputStream(docFile);

     HWPFDocument doc = new HWPFDocument(fis);

     WordExtractor extractor=new WordExtractor(doc);

    String result =extractor.getText();

     logger.info(result);

     

    这里测试用的是网上下载的doc文件,报出该文件实际是一个rtf文件的错误,网上的文档可能大多都为使用rtf模板生成的word文档,其实该文件的实际编码格式为rtf的格式,将文件存储为rtf后缀,发现也是能够打开的。

     

    java.lang.IllegalArgumentException: The document is really a RTF file

     

           at org.apache.poi.hwpf.HWPFDocumentCore.verifyAndBuildPOIFS(HWPFDocumentCore.java:126)

           at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:165)

     

    试着用rtf去解析

     

    String result = null;

    File file = new File("d://abc.doc");

    try {

        DefaultStyledDocument dsd = new DefaultStyledDocument();

        InputStream is = new FileInputStream(file);

        new RTFEditorKit().read(is, dsd, 0);

        System.out.println(  new String(dsd.getText(0, dsd.getLength()).getBytes()));

    } catch (IOException e) {

        e.printStackTrace();

    } catch (BadLocationException e) {

        e.printStackTrace();

    }

    打印出来的是乱码

     

    ÎĵµÏÂÔØÍøÊÇרҵµÄÃâ·ÑÎĵµËÑË÷ÓëÏÂÔØÍøÕ¾£¬ÌṩÐÐÒµ×ÊÁÏ£¬¿¼ÊÔ×ÊÁÏ£¬½Ìѧ¿Î¼þ£¬Ñ§ÊõÂÛÎÄ£¬¼¼Êõ×ÊÁÏ£¬Ñо¿±¨¸æ£¬¹¤×÷·¶ÎÄ£¬×ʸñ¿¼ÊÔ£¬wordÎĵµ£¬×¨ÒµÎÄÏ×£¬Ó¦ÓÃÎÄÊ飬ÐÐÒµÂÛÎĵÈÎĵµËÑË÷ÓëÎĵµÏÂÔØ£¬ÊÇÄúÎĵµÐ´×÷ºÍ²éÕҲο¼×ÊÁϵıر¸ÍøÕ¾¡£

    ÎĵµÏÂÔØ

    ÒÚÍòÎĵµ×ÊÁÏ£¬µÈÄãÀ´·¢ÏÖ

     

    将编码转成gbk

     

    new String(dsd.getText(0, dsd.getLength()).getBytes("ISO8859-1"),"GBK")

     

    正常解析

    将文件格式转为97-2003版的doc文件

    使用WordExtractor去解析可以了,所以在解析的时候也主要是看文档的实际格式为什么格式,而后缀为doc的实际文件格式也可以有很多种,如doc,xml,rtf等。在读取时也要有多种解析方式。

    展开全文
  • 多个csv文件数据导入到数据库对应表中,需要注意各表心得主键获取并插入到关联表中,时间格式,值是null的字符串处理等事项。
  • java实现多文件异步上传
  • 内容主要为service业务代码,分三模块(导入导出和模板下载),可自定义,注释比较全
  • JAVA利用poi实现sheet页excel文件导入导出要是觉得不好的很一般的也别喷哦,我也不是大神,可以给我建议哦。哈哈哈哈哈哈哈哈哈哈哈哈哈 一、介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有...


    一、介绍
    当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出Excel的应用。目前,比较常用的实现Java导入、导出Excel的技术有两种POI和Java Excel下面我就分别讲解一下如何使用这两个技术实现导入、导出Excel
    二、jar包准备

    官方下载这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版。

    三、具体

    keyValue
    HSSFWorkbookexcel的文档对象
    HSSFSheetexcel的表单
    HSSFRowexcel的行
    HSSFCellexcel的格子单元
    HSSFFontexcel字体
    HSSFDataFormat日期格式
    HSSFHeadersheet头
    HSSFFootersheet尾(只有打印的时候才能看到效果)

    前端js部分

    	/**
         * 导入excel文件
         * @param args
         */
        upfileExcel(args) {
            let fileId = $("#file").val();
            let data = {};
            data.excelId = fileId;
            args.data = data;
            ajaxRequest.ajax(args).then(function (msg) {
            });
            setTimeout(() => {
                this.reload();
            }, 2000)
        }
    

    controller部分

    /**
         * 导入Excel文件并且解析
         *
         * @param excelId
         * @param responese
         * @return
         * @throws Exception
         */
        @RequestMapping(value = "/upfile", method = RequestMethod.POST)
        public Result readExcel(String excelId, HttpServletResponse responese) throws Exception {
        //这块这个excelid也是我们封装好的因为需要标识符的,实际写的时候自己前端直接写js访问即可
            if (excelId != null && excelId != "") {
                //遍历上传的所有文件
                List<FileAttachment> list = attachService.list(excelId);
                if(list.size()==0){
                    return ResultFactory.create(CodeMsgBase.FAILURE);
                }
                for (int i = 0; i < list.size(); i++) {
                    FileAttachment fileAttachment = list.get(i);//这块遍历上传的文件
                    
                    //这块是做一个后期的存入检测文件是否存在的处理,返回值一个或者多个,则返回false不能导入
                    int a = OrganizationalManagementService.readExcel(fileAttachment);
                    if(a>=1){
                        return ResultFactory.create(CodeMsgBase.FAILURE);
                    }
                }
                //这块别照着我这样写哦  这是我们封装好的
                return ResultFactory.create(CodeMsgBase.SUCCESS);//这块返回成功
            } else {
                return ResultFactory.create(CodeMsgBase.FAILURE);//这块返回失败
            }
        }
    

    service部分

    	public int readExcel(FileAttachment fileAttachment) {
            try {
                String c = fileAttachment.getAttachmentPathStore();
                String attachmentName = fileAttachment.getAttachmentName();
                //截取字符串,获取本地存储文件名
                String[] split = c.split("/");
                String s = split[1];
                File file = new File(dir + "/" + s);
                InputStream in = new FileInputStream(file);
                //读取excel中的内容
                String extString = attachmentName.substring(attachmentName.lastIndexOf("."));
                int i = getBankListByExcel(in, extString);
                return i;
            } catch (Exception e) {
                e.printStackTrace();
                return 1;
            }
        }
    
    	
    	//这是一个遍历excel文件的方法,会遍历里面有多少sheet页每个sheet页的内容
        public int getBankListByExcel(InputStream in, String extString) throws Exception {
            Workbook work = null;
            try {
                if (".xls".equals(extString)) {
                    work = new HSSFWorkbook(in);
                } else if (".xlsx".equals(extString)) {
                    work = new XSSFWorkbook(in);
                } else {
                    work = null;
                }
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            //创建Excel工作薄
            if (null == work) {
                throw new Exception("创建Excel工作薄为空!");
            }
            //创建日志工具的对象
            Sheet sheet = null;
            Row row = null;
            Row rowHead = null;
            Cell cell = null;
            Object value = "";
            //遍历Excel中所有的sheet
            for (int i = 0; i < work.getNumberOfSheets(); i++) {
                sheet = work.getSheetAt(i);
                // 标题总列数
                rowHead = sheet.getRow(0);
                if (rowHead == null) {
                    continue;
                }
                //总列数colNum
                int colNum = rowHead.getPhysicalNumberOfCells();
                String[] keyArray = new String[colNum];
                Map<String, Object> map = new LinkedHashMap<>();
                //遍历当前sheet中的所有行
                for (int j = 1; j <= sheet.getLastRowNum(); j++) {
                    String sheetName = sheet.getSheetName();//sheet的名字
                    List<Object> dataList = new LinkedList<>();
                    row = sheet.getRow(j);
                    if (row == null) {
                        continue;
                    }
                    int n = 0;
                    int num = row.getLastCellNum();
                    //进行行数据判断,如果超出列的个数,输入日志进行记录
                    while (n < colNum) {
                        //这里把列循环到Map
                        if (row.getCell(n) != null) {
                            value = getCellFormatValue(row.getCell(n)).trim();
                            dataList.add(value);
                        } else {
                            value = "";
                            dataList.add(value);
                        }
                        n++;
                        value = "";
                    }
                    int num = orgBuildList(dataList, sheetName);
                    if (num == 1) {
                        return num;
                    }
                }
            }
            return 0;
        }
    
    
    	/**
         * 根据HSSFCell类型设置数据
         *
         * @param cell
         * @return
         */
        private String getCellFormatValue(Cell cell) {
            String cellvalue = "";
            if (cell != null) {
                // 判断当前Cell的Type
                switch (cell.getCellType()) {
                    // 如果当前Cell的Type为NUMERIC
                    case HSSFCell.CELL_TYPE_NUMERIC:
                    case HSSFCell.CELL_TYPE_FORMULA: {
                        // 判断当前的cell是否为Date
                        if (HSSFDateUtil.isCellDateFormatted(cell)) {
                            Date date = cell.getDateCellValue();
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            cellvalue = sdf.format(date);
                        }
                        // 如果是纯数字
                        else {
                            // 取得当前Cell的数值
                            cellvalue = String.valueOf(cell.getNumericCellValue());
                        }
                        break;
                    }
                    // 如果当前Cell的Type为STRIN
                    case HSSFCell.CELL_TYPE_STRING:
                        // 取得当前的Cell字符串
                        cellvalue = cell.getRichStringCellValue().getString();
                        break;
                    // 默认的Cell值
                    default:
                        cellvalue = " ";
                }
            } else {
                cellvalue = "";
            }
            return cellvalue;
        }
    
    
    
    	/**
         * 添加到数据库
         *
         * @param list
         * @param sheetName
         * @throws ParseException
         */
        public int orgBuildList(List list, String sheetName) throws ParseException {
            OrganizationalManagement org = null;
            if (sheetName.equals("班级信息")) {
                String a = list.get(0).toString();
                int org_1 = organizationalManagementMapper.findOrgMent(a);
                if (org_1 >= 1) {
                    return org_1;
                }
            }
            if (sheetName.equals("班级信息")) {
                OrganizationalManagement organizationalManagement = new OrganizationalManagement();
                organizationalManagement.setOrgName(list.get(0).toString());
                organizationalManagement.setEngName(list.get(1).toString());
                organizationalManagement.setOrgForshort(list.get(2).toString());
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                if (StringUtils.isBlank(list.get(3)+"")) {
                    organizationalManagement.setSaveDate(new Date());
                } else {
                    Date date = simpleDateFormat.parse(list.get(3).toString());
                    organizationalManagement.setSaveDate(date);
                }
                String[] a = list.get(4).toString().split("\\.");
                organizationalManagement.setOrgType(a[0]);
                String[] b = list.get(5).toString().split("\\.");
                organizationalManagement.setLevelCode(b[0]);
                String[] c = list.get(6).toString().split("\\.");
                organizationalManagement.setParentCode(c[0]);
                org = add(organizationalManagement);
                orgId = org.getId();
            }
            if (sheetName.equals("班级成员")) {
                OrgMember orgMember = new OrgMember();
                orgMember.setChineseName(list.get(0).toString());
                orgMember.setNationality(list.get(1).toString());
                orgMember.setGender((int) Double.parseDouble(list.get(2).toString()));
                orgMemberService.add(orgMember);
            }
            return 0;
        }
    

    导入就这样写好了,自己仔细看看代码,大概就这样因为比较急我也没去做什么优化。接下来是excel的导出了,这个其实也很简单的。

    四、导出

    controller部分

    	/**
         * 导出excel
         * @param zuId
         * @param response
         * @param request
         * @throws Exception
         * 导出其实很简单,就是把你要导出的数据拿到,然后通过方法放入到每一个sheet页里就好了
         */
        @RequestMapping(value = "/exportexcel/{zuId}",method = RequestMethod.GET)
        public void exportExcel(@PathVariable String zuId,HttpServletResponse response, HttpServletRequest request) throws Exception{
            OrganizationalManagement orgMent = OrganizationalManagementService.findOneById(zuId);//班级的数据
            List<OrgMember> orgMembers = orgMemberService.findAllByOrgId(zuId);//班级成员
           
    		//这块是设置导出的excel的sheet里面的第一行标题的名字
            String[] title_1 = {"班级名称","班主任是谁","数学老师","英语老师","体育老师","组织规模","住址"};
            String[] title_2 = {"学生名字","学生名字","学生名字","学生名字","性别","学生名字","职务"};
      
    	  	//这是设置导出的excel的每一个sheet页的名字
            String sheetName_1 = "班级信息";
            String sheetName_2 = "班级成员";
            OutputStream out = null;
            InputStream is = null;
            try{
                XSSFWorkbook wb = new XSSFWorkbook();
    
                XSSFSheet sheet = wb.createSheet(sheetName_1);
                excelUtils.writeOrg(sheet,orgMent,title_1);
    
                sheet = wb.createSheet(sheetName_2);
                excelUtils.writeMember(sheet,orgMembers,title_2)
    
                out = response.getOutputStream();
                response.reset();
                String codedFileName = "班级"+System.currentTimeMillis();
                response.setHeader("Content-Disposition", "attachment;filename="+new String(codedFileName.getBytes("gbk"), "iso8859-1")+".xlsx");
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
    
                wb.write(out);
                wb.close();
            }catch(Exception e){
                e.printStackTrace();
            }finally {
                try{
                    out.flush();
                    out.close();
                }catch(Exception e){
    
                }
            }
        }
    
    

    service部分

    @Component
    public class ExcelUtils {
        public void writeOrg(XSSFSheet sheetName, OrganizationalManagement orgMent, String[] title) {
            //在sheet中添加表头第0行。
            XSSFRow row = sheetName.createRow(0);
            //声明列对象
            XSSFCell cell = null;
            //创建excel标题
            for (int i = 0; i < title.length; i++) {
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
            }
            row = sheetName.createRow(1);
            row.createCell(0).setCellValue(orgMent.getOrgName());
            row.createCell(1).setCellValue(orgMent.getEngName());
            row.createCell(2).setCellValue(orgMent.getOrgForshort());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String time = sdf.format(orgMent.getSaveDate());
            row.createCell(3).setCellValue(time+"");
            row.createCell(4).setCellValue(orgMent.getOrgType());
            row.createCell(5).setCellValue(orgMent.getOrgScale());
            row.createCell(6).setCellValue(orgMent.getCapitalSource());
            row.createCell(7).setCellValue(orgMent.getActivityArea());
            row.createCell(8).setCellValue(orgMent.getLevelCode());
            row.createCell(9).setCellValue(orgMent.getParentCode());
        }
    	//这块是把你获取到的数据添加到excel中的每一列每一行中的 row行  cell具体某个单元格
    

    **

    要是觉得不好的很一般的也别喷哦,我也不是大神,可以给我建议哦。哈哈哈哈哈哈哈哈哈哈哈哈哈

    **

    展开全文
  • 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见src/main/resources/import-config.xml) 2、导出xml配置示例如下...
  • Java实现Excel文件导入导出

    千次阅读 2020-07-08 14:10:21
    Table of Contents 一:Jakarta POI方法导入导出Excel文件 1:导包: 2:Jakarta POI HSSF API组件...二:java Excel操作Excel文件 1:导包: 2:实例 3:jxl的样式和高级操作 3.1:数据格式化 3.2:单元格操作
  • Java选择多个文件上传

    千次阅读 2019-08-05 21:18:00
    导入了SmartUpload组件的前提下,一般的上传文件的代码为: //1.实例化SmartUpload类对象 SmartUpload smart = new SmartUpload(); //2.初始化上传环境 smart.initialize(config, request, response); /...
  • Java一次性下载多个文件

    千次阅读 2019-09-12 15:46:08
    最近项目遇到一个需求,需要一次性导出全部数据-,而且是按照500条数据一个文件。 话不说,开始。 新增Excel工具类 可以直接复制 import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util....
  • java导入文件数据的解决方案

    千次阅读 2018-11-05 23:02:56
    20G如果按照行读入的方式,需要20多个小时才能入库成功。主要性能瓶颈不是在内存,而是在数据库连接的次数。 比如批量单次插入1000条和单次插入200条,其实是五倍性能差距。 但是这个批量插入的条数是根据数据库缓存...
  • 用poi读取excel多个sheet内容,用流的方式判断excel的版本,2003,还是2007版本,并附带所需jar包,文件下载后解压,直接导入eclipse中即可使用
  • JAVA多个文件打包成ZIP压缩包输出

    千次阅读 2019-07-01 11:36:21
    工具类一(将多个远端文件读取并压缩) import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import ...
  • java excel导入线程批量插入数据库

    万次阅读 多人点赞 2018-06-14 17:02:29
    最近写了excel导入线程持久化到数据库的功能,捣鼓了一天才弄好,先记录下来防止自己忘了。 (1)先controller类中方法。 @AccessLog @ApiOperation(value = "导入excel", httpMethod = "...
  • JAVA个文件多个类 ( 同级类 ) 规则和注意点

    万次阅读 多人点赞 2018-11-22 22:11:12
    在一个.java文件中可以有多个同级类, 其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一个,且必须要与文件名相同; 因为jvm虚拟机为了提高查找类的速度,使用import语句导入的时候,只会...
  • 一:先在E盘准备两excel,后缀名分别是xls,xlsx。 二:看一下两excel里分面有什么内容。 1.xlsx中含有sheet1和sheet2。 sheet1中有三条记录,并且在表头上方有一“说明”单元格,当然这说明的内容不是...
  • JAVA导入文件超时问题

    千次阅读 2019-12-27 10:26:11
    JAVA导入文件超时问题前言解决问题的思路根据业务数据定制代码 前言 业务的临时需求,需要开发一订单EXCEL导入的功能,从开发到上生产差不多是5天。在SIT环境上,导入400条数据大概是1分钟,于是和客户沟通的是100...
  • Java解析Excel文件导入

    千次阅读 2018-08-09 13:43:18
    Java中使用Apache POI 解析Excel文件 1.首先在pom.xml文件中注入依赖: 代码如下: &lt;dependency&gt;  &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;  &lt;artifactId&...
  • java导入Excel表格数据

    千次阅读 多人点赞 2019-05-08 13:55:09
    一、思路是这样的: 1.先做好一Excel模板供用户下载,例如下图 2.用户使用模板填好数据,上传Excel文件到web后台,后台接收文件。 ... 3.把用户上传的文件进行...1.要导入的数据JAVA对象如下: public clas...
  • Java POI导入导出Excel文件

    万次阅读 多人点赞 2019-06-12 21:39:41
    Java POI Excel导入导出Excel文件 一、导入pom文件(版本号一定要相同,不然会报错) <!--读取excel文件--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>...
  • Java 导入导出功能总结

    万次阅读 多人点赞 2018-07-10 15:24:38
    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作:pom中加入以下依赖: <dependency> <groupId>...
  • mysql批量导入多个sql文件

    千次阅读 2020-08-15 11:34:30
    1、将多个sql文件拷贝到D:\\sql目录,目录自定义 2、通过java程序输出该目录下的sql文件信息 package com.zoro.fileoperate; import java.io.File; public class FileUtil { public static void main(String...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 343,745
精华内容 137,498
关键字:

java怎么导入多个文件

java 订阅