精华内容
参与话题
问答
  • Java 导入导出功能总结

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

    项目中经常需要使用导入导出功能来加快数据的操作,尤其是一些项目的后台管理系统,特此奉上我们项目中使用到导入导出代码,均可以实际使用。准备工作:pom中加入以下依赖:

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

    导入功能


    基本思路:读取到文件--->创建表格并把文件流内容读取到表格中--->解析表格--->持久化

    package com.simons.cn.springbootdemo.util;
    
    import com.simons.cn.springbootdemo.bean.Movie;
    import com.simons.cn.springbootdemo.service.Weixin.IndexService;
    import org.apache.poi.ss.usermodel.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.util.FileCopyUtils;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    @Service
    public class FilePortUtil {
        private static final Logger log = LoggerFactory.getLogger(FilePortUtil.class);
    
        @Autowired
        private IndexService indexService;
    
        /**
         * 导入功能
         *
         * @param multipartFile
         * @return
         */
        public int fileImport(MultipartFile multipartFile) {
            File file = null;
            Workbook workbook = null;
            int totalNum = 0;
            /*得到的path是 /D:/springbootdemo/target/springbootdemo/WEB-INF/classes/  */
            String path = FilePortUtil.class.getClassLoader().getResource("/").getPath();
            /*拼接后的path就是 /D:/springbootdemo/target/springbootdemo/WEB-INF/电影正式资源.xlsx /*/
            path = path.substring(0, path.indexOf("WEB-INF") + "WEB-INF".length()) + "/" + multipartFile.getOriginalFilename();
            file = new File(path);
            try {
                /*把文件流copy读取到文件中*/
                FileCopyUtils.copy(multipartFile.getBytes(), file);
                workbook = WorkbookFactory.create(new FileInputStream(file));
                List<Movie> list = new ArrayList<>();
                /*遍历sheet页*/
                for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                    Sheet sheet = workbook.getSheetAt(i);
                    if (sheet == null) {
                        continue;
                    }
                    /*统计导入的总条数,要是你的excell包含了表头,就不用加1了*/
                    if (sheet.getLastRowNum() > 0) {
                        totalNum += sheet.getLastRowNum() + 1;
                    }
                    /*遍历行,这里j的初始值取1是因为我的表格里第一行是表头*/
                    for (int j = 1; j < sheet.getPhysicalNumberOfRows(); j++) {
                        Row row = sheet.getRow(j);
                        /*解析列,下标从0开始*/
                        Cell cell2 = row.getCell(2);
                        Cell cell3 = row.getCell(3);
                        if (cell2 == null || cell3 == null) {
                            continue;
                        }
                        String name = this.getCellValue(cell2);
                        String original = this.getCellValue(cell3);
    
                        /*我这里省略了很多数据清洗、校验的代码*/
                        
                        Movie movie = new Movie();
                        movie.setName(name);
                        movie.setOriginal(original);
                        list.add(movie);
                    }
                    /*持久化:批量新增*/
                    indexService.insertBatch(list);
                }
                /*解析完删除此路径下的文件*/
                file.delete();
                return totalNum;
            } catch (Exception e) {
                e.printStackTrace();
                log.error("导入功能公用类异常exception={}", e);
            }
            return totalNum;
        }
    
        public String getCellValue(Cell cell) {
            if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
                return String.valueOf(cell.getBooleanCellValue());
            } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
                Double d = cell.getNumericCellValue();
                return String.valueOf(d.intValue());
            }
            return String.valueOf(cell.getStringCellValue());
        }
        
    }

    一般来说,每个导入功能处理的逻辑不太一样,里面的校验、数据对象也不太一样,所以我这里就没有封装成公用类而仅仅写成service,里面具体的逻辑交由程序员填充。


    导出功能

    导出功能是最常用的,下面的代码中用到了反射的思想,比如,你查询出来的List<T>结果集,只想导出指定的那些字段数据,就非常方便了,代码如下:


    基本思路:创建表格对象--->将数据set进表格--->将表格流写入response返回

    package com.simons.cn.springbootdemo.util;
    
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.commons.lang.time.DateFormatUtils;
    import org.apache.poi.hssf.usermodel.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Service;
    
    import javax.servlet.http.HttpServletResponse;
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    
    public class FilePortUtil {
        private static final Logger log = LoggerFactory.getLogger(FilePortUtil.class);
    
        /**
         * 导出功能
         * 注意:泛型T类字段名和containBean集合里字段名字的一致性
         *
         * @param response
         * @param title       表名
         * @param headers     表头
         * @param list        数据集
         * @param containBean 数据集类型字段
         * @param <T>
         * @throws Exception
         */
        public static <T> void exportExcel(HttpServletResponse response, String title, String[] headers, List<T> list, List<String> containBean) throws Exception {
            HSSFWorkbook workbook = null;
            try {
                workbook = new HSSFWorkbook();
                HSSFSheet sheet = workbook.createSheet(title);
                HSSFRow row = sheet.createRow(0);
                /*创建第一行表头*/
                for (short i = 0; i < headers.length; i++) {
                    HSSFCell cell = row.createCell(i);
                    HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                    cell.setCellValue(text);
                }
                Iterator<T> it = list.iterator();
                int index = 0;
                while (it.hasNext()) {
                    index++;
                    row = sheet.createRow(index);
                    T t = (T) it.next();
                    /*反射得到字段*/
                    Field[] fields = t.getClass().getDeclaredFields();
                    /*如果需要匹配*/
                    if (CollectionUtils.isNotEmpty(containBean)) {
                        for (int j = 0; j < containBean.size(); j++) {
                            for (int i = 0; i < fields.length; i++) {
                                Field field = fields[i];
                                if (!field.getName().equals(containBean.get(j)))
                                    continue;
                                /*给每一列set值*/
                                setCellValue(t, field, row, j);
                            }
                        }
                    } else {
                        for (int i = 0; i < fields.length; i++) {
                            Field field = fields[i];
                            setCellValue(t, field, row, i);
                        }
                    }
                }
                /*application/vnd.ms-excel告诉浏览器要下载的是个excel*/
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                /*请求头设置,Content-Disposition为下载标识,attachment标识以附件方式下载*/
                response.addHeader("Content-Disposition", "attachment;filename=" + new String((title).getBytes(), "ISO8859-1") + ".xls");
                workbook.write(response.getOutputStream());
            } finally {
                if (workbook != null) {
                    workbook.close();
                }
            }
        }
    
        /**
         * 设置每一行中的列
         *
         * @param t
         * @param field
         * @param row
         * @param index
         * @param <T>
         */
        private static <T> void setCellValue(T t, Field field, HSSFRow row, int index) {
            HSSFCell cell = row.createCell(index);
            Object value = invoke(t, field);
            String textValue = null;
            if (value != null) {
                if (value instanceof Date) {
                    Date date = (Date) value;
                    textValue = DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
                } else {
                    textValue = value.toString();
                }
            }
            if (textValue != null) {
                cell.setCellValue(textValue);
            }
        }
    
        /**
         * 反射映射数据集字段
         *
         * @param t
         * @param field
         * @param <T>
         * @return
         */
        private static <T> Object invoke(T t, Field field) {
            try {
                String fieldName = field.getName();
                PropertyDescriptor pd = new PropertyDescriptor(fieldName, t.getClass());
                Method method = pd.getReadMethod();
                return method.invoke(t);
            } catch (Exception e) {
                return null;
            }
        }
    }

        @ResponseBody
        @RequestMapping(value = "/fileport", method = RequestMethod.GET)
        public void filePort(HttpServletResponse response) {
            //导出的表名
            String title = "测试导出活动参与记录";
            //表中第一行表头字段
            String[] headers = {"主键id", "用户名", "活动id", "奖品id", "中奖时间"};
            //实际数据结果集
            List<UserReward> listObject = userRewardDao.queryUserActivityInfo("2018shuangdan_act", "2018shuangdan_evt", "sdthanks");
            //具体需要写入excel需要哪些字段,这些字段取自UserReward类,也就是上面的实际数据结果集的泛型
            List<String> listColumn = Arrays.asList("id", "username", "actId", "rewardId", "winRewardTime");
            try {
                FilePortUtil.exportExcel(response, title, headers, listObject, listColumn);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    如上代码实际项目中都能使用,如有问题欢迎留言哈~


    books 引申阅读: 使用quartz实现高级定制化定时任务(包含管理界面)

    books 推荐阅读:elastic search搜索引擎实战demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es

    展开全文
  • 在vue项目中实现 将 ECharts 图表数据导出excel 两种方式

    方法一
    Vue 将页面中表格数据导出excel
    一、需要安装三个依赖:

      npm install -S file-saver xlsx
      
      npm install -D script-loader
    

    二、项目中新建一个文件夹:(vendor—名字任取)

    里面放置两个文件Blob.js和 Export2Excel.js。
      
    链接:https://pan.baidu.com/s/1krRDSw6PHylWlg5yslwZGA 密码:qotw

    下载后直接将文件夹放到src目录下即可。

    三、在.vue文件中
      在methods里写这两个方法:其中list是表格的内容

     // 导出表格
    export2Excel() {
        require.ensure([], () => {
              let { exportJsonToExcel } = require('../../vendor/Export2Excel');
               // 表头
              let tHeader = ['序号', 'IMSI', 'MSISDN', '证件号码'];
              //表头对应字段名,要和下面数据key对应
              let filterVal = ['iAutoID', 'Address', 'AuctionDate', 'Area'];
              // 数据来源
              // let list = this.serachData;
              //模拟数据
               let list =  [
               {iAutoID: "4737", Address: "海门市海门镇南海路南、长江路东侧", AuctionDate: "0000-00-00", Area: ""},
               {iAutoID: "21337", Address: "上海市浦东新区东至:A13B-01地块,南至:A13B-01地块,西至:国展路,北至:A13B-01地块",Area: ""},
               {iAutoID: "17373", Address: "白马大道以东、建业路以北", AuctionDate: "0000-00-00", Area: ""},
                {iAutoID: "17271", Address: "黄陂区横店街川龙大道以东、横中路以北", AuctionDate: "0000-00-00", Area: "黄陂"},
                {iAutoID: "20577", Address: "南通市海门四甲镇东渐大道北侧、军工路南侧", AuctionDate: "0000-00-00", Area: ""},
                {iAutoID: "18929", Address: "奥诺斯特以东、黄河路以南", AuctionDate: "2018-09-21", Area: ""}]
                   let data = this.formatJson(filterVal, list); //数据格式化
                   var index1 = '资源列表';//导出时文件名
                   exportJsonToExcel(tHeader, data, index1); //导出文件
                  })
                },
                // 数据格式化
                formatJson(filterVal, jsonData){
                    return jsonData.map(v => filterVal.map(j => v[j]))
                },
    

    四、添加按钮导出调用export2Excel方法

    <el-button plain size="mini" @click="export2Excel" >导出数据</el-button>
    

    方法二
    将table标签,包括tr、td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html,代码如下

    <template>
      <button @click="tableToExcel">导出</button>
    </template>
      
      <script>
    export default {
      data() {
        return {
          jsonData: [
            {
              name: "路人甲",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "炮灰乙",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "土匪丙",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "流氓丁",
              phone: "123456",
              email: "123@123456.com"
            }
          ]
        };
      },
      methods: {
        tableToExcel() {
          //要导出的json数据
    
          //列标题
          let str = "<tr><td>姓名</td><td>电话</td><td>邮箱</td></tr>";
          //循环遍历,每行加入tr标签,每个单元格加td标签
          for (let i = 0; i < jsonData.length; i++) {
            str += "<tr>";
            for (let item in jsonData[i]) {
              //增加\t为了不让表格显示科学计数法或者其他格式
              str += `<td>${jsonData[i][item] + "\t"}</td>`;
            }
            str += "</tr>";
          }
          //Worksheet名
          let worksheet = "Sheet1";
          let uri = "data:application/vnd.ms-excel;base64,";
    
          //下载的表格模板数据
          let template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" 
          xmlns:x="urn:schemas-microsoft-com:office:excel" 
          xmlns="http://www.w3.org/TR/REC-html40">
          <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
            <x:Name>${worksheet}</x:Name>
            <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
            </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
            </head><body><table>${str}</table></body></html>`;
          //下载模板
          window.location.href = uri + base64(template);
        }
        //输出base64编码
        function base64 (s) { return window.btoa(unescape(encodeURIComponent(s))) }
      }
    };
    </script>
    
    

    方法三
    通过将json遍历进行字符串拼接,将字符串输出到csv文件,代码如下

    <template>
      <button @click="tableToExcel">导出</button>
    </template>
      
      <script>
    export default {
      data() {
        return {
          jsonData: [
            {
              name: "路人甲",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "炮灰乙",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "土匪丙",
              phone: "123456",
              email: "123@123456.com"
            },
            {
              name: "流氓丁",
              phone: "123456",
              email: "123@123456.com"
            }
          ]
        };
      },
      methods: {
        tableToExcel() {
          //列标题,逗号隔开,每一个逗号就是隔开一个单元格
          let str = `姓名,电话,邮箱\n`;
          //增加\t为了不让表格显示科学计数法或者其他格式
          for (let i = 0; i < jsonData.length; i++) {
            for (let item in jsonData[i]) {
              str += `${jsonData[i][item] + "\t"},`;
            }
            str += "\n";
          }
          //encodeURIComponent解决中文乱码
          let uri = "data:text/csv;charset=utf-8,\ufeff" + encodeURIComponent(str);
          //通过创建a标签实现
          let link = document.createElement("a");
          link.href = uri;
          //对下载的文件命名
          link.download = "json数据表.csv";
          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
        }
      }
    };
    </script>
    
    
    展开全文
  • Java导入Excel工具类使用教程

    千次阅读 2019-03-26 11:06:43
    本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖`org.apache.poi`包。支持RESTful API,支持Spring MVC中使用。 本工具类支持功能: - 支持File类型导入 ...

    前言:

    本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包。支持RESTful API,支持Spring MVC中使用。

    一.本工具类支持功能:

    • 支持File类型导入
    • 支持MultipartFile类型导入
    • 支持Excel2003及以上版本

    二.工具类

    所需jar包依赖org.apache.poi版本:

     <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
     </dependency>
    

    本工具类,可直接在项目中使用:

    package com.excel.util;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.usermodel.WorkbookFactory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * Excel导入工具类
     */
    public class ImportExcelUtil {
    
        // 正则表达式 ,用于判断是get还是set方法
        private static final String REGEX = "[a-zA-Z]";
    
        private static final Logger log = LoggerFactory.getLogger(ImportExcelUtil.class);
    
        /**
         * @param multipartFile
         * @param startRow      开始行
         * @param endRow        结束行(0表示到最后一行结束)
         * @param clazz
         * @return
         * @throws Exception
         */
        public static List<List<Object>> importExcelMultipartFile(MultipartFile multipartFile, int startRow, int endRow,
                                                                  Class<?> clazz) throws Exception {
            // 判断文件是否存在
            if (multipartFile == null || multipartFile.isEmpty()) {
                throw new IOException("Excel文件内容为空或不存在!");
            }
            String name = "Excel" + System.currentTimeMillis();
            File file = File.createTempFile(name, null);
            multipartFile.transferTo(file);
            if (!file.exists()) {
                throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
            }
            return importExcelFile(file, startRow, endRow, clazz);
        }
    
        /**
         * 根据文件导入Excel,仅导入数据,去除校验
         *
         * @param file     文件
         * @param startRow 开始行,从0开始
         * @param endRow   结束行,0表示所有行; 正数表示到第几行结束; 负数表示到倒数第几行结束
         * @param clazz    sheet需要映射的对象类型
         * @return List<List < Object>>
         * @throws Exception
         */
        public static List<List<Object>> importExcelFile(File file, int startRow, int endRow, Class<?> clazz)
                throws Exception {
            List<List<Object>> sheetsData = new ArrayList<>();
            // 判断文件是否存在
            if (!file.exists()) {
                throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
            }
            Workbook wb = null;
            FileInputStream inputStream = null;
            try {
                inputStream = new FileInputStream(file);
                // 工厂模式,根据Excel版本(2003版以前版本,或其他版本),创建对应的工作薄处理类
                wb = WorkbookFactory.create(inputStream);
                for (int sheetNumber = 0; sheetNumber < wb.getNumberOfSheets(); sheetNumber++) {
                    List<Row> rowList = new ArrayList<Row>();
                    Sheet sheet = wb.getSheetAt(sheetNumber);
                    // 获取最后行号
                    int lastRowNum = sheet.getLastRowNum();
                    Row row = null;
                    Pattern p = Pattern.compile("\\s*|\t|\r|\n");
                    // 循环读取
                    for (int i = startRow; i <= lastRowNum + endRow; i++) {
                        // 是否全部单元格都为空
                        boolean isEmptyRow = true;
                        row = sheet.getRow(i);
                        if (row != null) {
                            // 获取每一单元格的值
                            for (int j = 0; j < row.getLastCellNum(); j++) {
                                String value = p.matcher(getCellValue(row.getCell(j))).replaceAll("");
                                if (!value.trim().equals("")) {
                                    isEmptyRow = false;
                                }
                            }
                            // 校验规则:如果是空白行,没有数据,仅有空格符、制表符等字符(用户无意间输入的字符),则应该过滤掉。
                            if (!isEmptyRow) {
                                // 该行数据中存在非空单元格,则返回该行
                                rowList.add(row);
                            }
                        }
                    }
                    sheetsData.add(returnObjectList(rowList, clazz));
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (wb != null) {
                    wb.close();
                }
            }
            return sheetsData;
        }
    
        /**
         * 功能:返回指定的对象集合
         */
        private static List<Object> returnObjectList(List<Row> rowList, Class<?> clazz) {
            List<Object> objectList = null;
            Object obj = null;
            String attribute = null;
            String value = null;
            int j = 0;
            try {
                objectList = new ArrayList<Object>();
                Field[] declaredFields = clazz.getDeclaredFields();
                for (Row row : rowList) {
                    j = 0;
                    obj = clazz.newInstance();
                    for (Field field : declaredFields) {
                        try {
                            attribute = field.getName().toString();
                            value = getCellValue(row.getCell(j));
                            setAttrributeValue(obj, attribute, value.trim());
                            j++;
                        } catch (Exception e) {
                            log.info("属性映射出错,属性名:" + attribute + "属性值:" + value);
                            e.printStackTrace();
                        }
                    }
                    // 仅提取没有非空字段的对象
                    objectList.add(obj);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return objectList;
        }
    
        /**
         * 功能:获取单元格的值
         */
        @SuppressWarnings("deprecation")
        private static String getCellValue(Cell cell) {
            Object result = "";
            if (cell != null) {
                switch (cell.getCellType()) {
                    case Cell.CELL_TYPE_STRING:
                        result = cell.getStringCellValue();
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        result = cell.getNumericCellValue();
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                        result = cell.getBooleanCellValue();
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        result = cell.getCellFormula();
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        result = cell.getErrorCellValue();
                        break;
                    case Cell.CELL_TYPE_BLANK:
                        break;
                    default:
                        break;
                }
            }
            return result.toString();
        }
    
        /**
         * 功能:给指定对象的指定属性赋值
         */
        private static void setAttrributeValue(Object obj, String attribute, String value) {
            if (value == null || value.trim().equals("")) {
                return;
            }
            // 得到该属性的set方法名
            String method_name = convertToMethodName(attribute, obj.getClass(), true);
            Method[] methods = obj.getClass().getMethods();
            for (Method method : methods) {
                /**
                 * 因为这里只是调用bean中属性的set方法,属性名称不能重复 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法 (注:在java中,锁定一个方法的条件是方法名及参数)
                 */
                if (method.getName().equals(method_name)) {
                    Class<?>[] parameterC = method.getParameterTypes();
                    try {
                        /**
                         * 如果是(整型,浮点型,布尔型,字节型,时间类型), 按照各自的规则把value值转换成各自的类型 否则一律按类型强制转换(比如:String类型)
                         */
                        if (parameterC[0] == int.class || parameterC[0] == java.lang.Integer.class) {
                            int index = value.lastIndexOf(".");
                            if (index != -1) {
                                value = value.substring(0, index);
                            }
                            try {
                                method.invoke(obj, Integer.valueOf(value));
                            } catch (Exception e) {
                                System.out.println(value);
                                e.printStackTrace();
                            }
                            break;
                        } else if (parameterC[0] == float.class || parameterC[0] == java.lang.Float.class) {
                            method.invoke(obj, Float.valueOf(value));
                            break;
                        } else if (parameterC[0] == double.class || parameterC[0] == java.lang.Double.class) {
                            method.invoke(obj, Double.valueOf(value));
                            break;
                        } else if (parameterC[0] == byte.class || parameterC[0] == java.lang.Byte.class) {
                            method.invoke(obj, Byte.valueOf(value));
                            break;
                        } else if (parameterC[0] == boolean.class || parameterC[0] == java.lang.Boolean.class) {
                            method.invoke(obj, Boolean.valueOf(value));
                            break;
                        } else if (parameterC[0] == java.util.Date.class) {
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
                            Date date = null;
                            try {
                                date = sdf.parse(value);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            method.invoke(obj, date);
                            break;
                        } else {
                            method.invoke(obj, parameterC[0].cast(value));
                            break;
                        }
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * 功能:根据属性生成对应的set/get方法
         */
        private static String convertToMethodName(String attribute, Class<?> objClass, boolean isSet) {
            /** 通过正则表达式来匹配第一个字符 **/
            Pattern p = Pattern.compile(REGEX);
            Matcher m = p.matcher(attribute);
            StringBuilder sb = new StringBuilder();
            /** 如果是set方法名称 **/
            if (isSet) {
                sb.append("set");
            } else {
                /** get方法名称 **/
                try {
                    Field attributeField = objClass.getDeclaredField(attribute);
                    /** 如果类型为boolean **/
                    if (attributeField.getType() == boolean.class || attributeField.getType() == Boolean.class) {
                        sb.append("is");
                    } else {
                        sb.append("get");
                    }
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
            }
            /** 针对以下划线开头的属性 **/
            if (attribute.charAt(0) != '_' && m.find()) {
                sb.append(m.replaceFirst(m.group().toUpperCase()));
            } else {
                sb.append(attribute);
            }
            return sb.toString();
        }
    
    }
    
    

    三.如何使用:

    1.导入MultipartFile类型(推荐)

    应用场景: Web页面中通过MultipartFile上传文件,可直接转为List<List<Object>>

    使用示例:

     @PostMapping(value = "/project/import")
        public ResultObject importAlarmEvents(@RequestParam MultipartFile file) {
          
            try {
                // 从Excel第一行起到最后一行结束,
                List<List<Object>> excelData = ImportExcelUtil.importExcelMultipartFile(file, 1, 0, EventDTO.class);
                if (excelData == null || excelData.isEmpty()) {
                    result.setMessage("导入失败,Excel内容为空");
                    return result;
                }
                //将Excel中数据,转为你的实体类
                List<List<EventDTO>> alarmList = new ArrayList<>();
                for (List<?> list : excelData) {
                    alarmList.add((List<EventDTO>) list);
                }
                Map<String, Object> res = eventService.importEvent(alarmList);
            } catch (Exception e) {
                result.setMessage(e.getMessage());
            }
            return result;
        }
    
    

    2.导入文件格式为File

    应用场景: Web页面中通过File上传文件,可直接转为List<List<Object>>

    使用示例:

     @PostMapping(value = "/project/import")
        public ResultObject importAlarmEvents(@RequestParam File file) {
          
            try {
                // 从Excel第一行起到最后一行结束,
                List<List<Object>> excelData = ImportExcelUtil.importExcelFile(file, 1, 0, EventDTO.class);
                if (excelData == null || excelData.isEmpty()) {
                    result.setMessage("导入失败,Excel内容为空");
                    return result;
                }
                //将Excel中数据,转为你的实体类
                List<List<EventDTO>> alarmList = new ArrayList<>();
                for (List<?> list : excelData) {
                    alarmList.add((List<EventDTO>) list);
                }
                Map<String, Object> res = eventService.importEvent(alarmList);
            } catch (Exception e) {
                result.setMessage(e.getMessage());
            }
            return result;
        }
    
    

    实体类示例:

    注意:实体类的属性声明顺序,必须跟Excel列头顺序保持一致,否则会出现列数据和属性名对应不上问题

    package com.entity.dto;
    
    import java.io.Serializable;
    
    /**
     * 数据转Excel对象 注:属性名的顺序和Excel列顺序必须相同
     */
    @SuppressWarnings("serial")
    public class EventDTO implements Serializable {
    	// 列字段1
    	private String name;
    	// 列字段2
    	private String code;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getCode() {
    		return code;
    	}
    
    	public void setCode(String code) {
    		this.code = code;
    	}
    }
    
    

    Excel实用教程集锦

    以下是我写的关于Java操作Excel的所有教程,基本包含了所有场景。

    1.如果简单导出推荐使用工具类的方式,这种配置最简单。

    2.如果对导出样式要求极高的还原度,推荐使用Freemarker方式,FreeMarker模板引擎可以通吃所有Excel的导出,属于一劳永逸的方式,项目经常导出推荐使用这种方式。

    3.Freemarker导出的Excel为xml格式,是通过重命名为xls后,每次会打开弹框问题,我在《Freemarker整合poi导出带有图片的Excel教程》也已经完美解决,本教程将直接导出真正的xls格式,完美适配新版office和wps。Freemarker是无法导出带有图片的Excel,通过其他技术手段,也在本教程中完美导出带有图片的Excel。

    4.下列教程中的代码都经本人和网友多次验证,真实有效!

    ↓↓↓↓一揽子Excel解决方案,赶快收藏吧↓↓↓↓

    《Java导入Excel工具类使用教程》

    《Java之Excel导出工具类使用教程》

    《Freemarker导出复杂Excel图文教程》

    《Freemarker整合poi导出带有图片的Excel教程》

    展开全文
  • IDEA导入jar包

    万次阅读 多人点赞 2019-05-24 15:33:06
    一、导入 1、java项目在没有导入该jar包之前,如图: 2、点击 File -> Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Project Structure界面左侧的“Modules”如图: 3、在 ...

    一、导入

    1、java项目在没有导入该jar包之前,如图:

     

    2、点击 File ->  Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Project Structure界面左侧的“Modules”如图:

     

    3、在 “Dependencies” 标签界面下,点击右边绿色的 “+”号,选择第一个选项“JARs or directories...”,选择相应的jar包,点“OK”,jar包添加成功

     

    4、点“OK”回到项目界面,IntelliJ IDEA自动提示需要添加import语句,利用 Alt+Enter 键快速添加import语句之后,项目成功编译

     

     

    二、打jar包

    1、点击 File ->  Project Structure(快捷键 Ctrl + Alt + Shift + s),点击Project Structure界面左侧的“Artifacts”如图:

     

     

    2、Artifacts->"+",选jar,选择from modules with dependencies,后有配置窗口出现,配置完成后,勾选Build on make >ok保存

     

     

    3、菜单:Build->make project,注意这里可能会报编译错误,最好提前检查一下编译器版本:File>Settings>Java Compiler,修改Target bytecode version版本为1.8,另外项目版本Project Structure-Project/Modules版本改为1.8

     

    以下是检查编译器版本截图,不需时可忽略:

    (1)File>Settings>Java Compiler,修改Target bytecode version版本为1.8

    (2)Project Structure>Project/Modules版本改为1.8

     

    4、去打包输出路径,找到jar包

    展开全文
  • 导入

    2019-05-08 20:43:39
    导入 点击导入考生就会弹出一个Execl表格的模态框,弹出的表格只是临时的Execl表格,用完了,再次打开时数据就被清空了 上面就是弹出的模态框,这个模态框有下载导入模板和导入数据库的功能,首先我们先来完成...
  • Python 3.x | 史上最详解的 导入(import)

    万次阅读 多人点赞 2018-07-27 15:05:02
    win10+Python 3.6.3 一、理解一些基本概念 1、包、模块 模块 module:一般情况下,是一个以.py为后缀的文件。其他可作为module的文件类型还有”.pyo”、”.pyc”、”.pyd”、”.so”、”.dll”,但Python初学者...
  • Veusz教程(1)——导入数据

    千次阅读 2019-04-21 09:37:58
    本博客主要介绍Veusz导入数据的功能。 主要介绍下面三种数据格式的导入: (1)常规数据(空格间隔每列数据) (2)CSV数据 (3)二维数据 常规数据 通常我们处理实验数据的时候都需要拟合,假如我们有这样一组数据...
  • impdp导入

    千次阅读 2017-12-21 15:46:54
    《Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(上)》 《Oracle简单常用的数据泵导出导入(expdp/impdp)命令举例(下)》 目的:指导项目侧自行进行简单的数据泵迁移工作。 本文实验环境:Oracle 11.2.0.4...
  • Java中import 导入的用法

    万次阅读 2018-12-11 19:21:53
    import 导入的用法 可以导入类,导入包,导入项目 导入方式: 1:全局导入:导入声明在方法外 2:局部导入:导入声明在方法中 当你自定义的类和系统的类重名的时候,如果要使用系统类,就得使用局部导入 注意:尽量...
  • 文章目录一、导入JWT依赖二、JWTUtil三、JWTInterceptor四、WebConfiguration五、在登陆时产生token传递给前端 本文主要参考了以下两篇文章,如果对JWT不熟悉则可以进去了解: ...
  • Oracle数据泵导入导出是日常工作中常用的基本技术之一,我们使用oracle数据库数据泵导入(impdp)导出(expdp)进行数据库备份,数据库迁移等数据库维护工作。本文主要说明oracle数据库导入导出的命令。
  • idea如何导入并运行maven项目,idea导入并运行java web项目 1、第一步启动idea点open找到自己的项目,注意如果是一个java工程下面就会有一个减号一样的 2、右下角观察等待idea导入完毕,比电脑的性能的时候到了 3...
  • idea2019导入maven项目中的某些问题

    万次阅读 热门讨论 2019-09-24 21:12:48
    idea2019导入maven项目中的某些问题 idea2019导入maven项目,会出现很多莫名其妙的问题,如果出现问题,从以下几点查看 查看maven配置 选中File -> Settings ->Build, Execution, Deployment ->Build ...
  • idea 自动导入包 快捷键

    万次阅读 多人点赞 2017-09-29 17:27:34
    IntelliJ IDEA 自动导入包 快捷方式 idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们...
  • oracle11g数据库导入导出方法教程

    万次阅读 多人点赞 2018-03-04 15:03:09
    oracle11g数据库导入导出: ①:传统方式——exp(导出)和(imp)导入: ②:数据泵方式——expdp导出和(impdp)导入; ③:第三方工具——PL/sql Develpoer;一、什么是数据库导入导出? oracle11g数据库的导入/导出,...
  • Endnote使用指南——Endnote导入参考文献到Word中

    万次阅读 多人点赞 2019-06-25 13:03:32
    对于科研学子来说,EndNote(或NoteExpress)是管理文献的利器,能够快速筛选文献与录入参考文献,非常适用于参考文献较多的场合。 首先Endnote的安装这里就不赘述,...提取码:33v4 接下来就讲讲我们的正题: ...
  • plsql导入.dmp步骤

    万次阅读 多人点赞 2017-10-13 22:43:20
    plsql导入.sql和.dmp文件时,会经常用到,对于初学者来说可能没有那么简单,毕竟oracle数据库比较麻烦。 下面是我自己导入.sql和.dmp文件的步骤。 1.导入.sql文件(sql文件是表结构文件,不包含数据)工具->导入表...
  • IDEA导入Eclipse项目

    万次阅读 多人点赞 2019-05-30 08:38:19
    背景:用习惯了idea再去用eclipse实在用的不习惯,于是将老的eclipse项目导入到eclipse,网上有很多教程,看了很多博客都不行,一直报错,各种报错,现在终于好了,我们一起来看看怎么将eclipse的项目导入到idea ...
  • IDEA导入maven项目详细介绍

    万次阅读 多人点赞 2018-04-14 19:42:38
    一、 项目结构 注意,.classpath是eclipse特有文件,如果项目会使用...注意,我们是导入maven项目,因此项目根目录下一定存在相对应的maven配置Pom.xml文件,点击OK,继续下一步。 3、选择导入的项目类型 ...
  • IntelliJ IDEA导入Web项目

    万次阅读 2018-03-13 10:47:21
    转自:Idea导入Web项目 概述 主要分为项目配置和tomcat配置两大步骤。 一、项目配置 打开idea,选择导入项目 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的...

空空如也

1 2 3 4 5 ... 20
收藏数 1,803,408
精华内容 721,363
关键字:

导入