liuxiaolong
2019-05-06 f99bc8c6a1d10610373738edd7d0aa0181c81d99
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
 
package com.cloud.user.utils;
 
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
 
import com.cloud.model.sys.BbEmployee;
import org.apache.log4j.Logger;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
import org.springframework.web.multipart.MultipartFile;
 
 
public class ExcelImportUtil {
        //定义日志打印  和文件常量后缀名
        private static Logger logger  = Logger.getLogger(ExcelImportUtil.class);
        private final static String xls = "xls";
        private final static String xlsx = "xlsx";
 
        /**
         * 读入excel文件,解析后返回
         * @param file
         * @throws IOException
         */
        public static List<String[]> readExcel(MultipartFile file,Integer startRow) throws IOException{
            //检查文件
            boolean checkFile = checkFile(file);
            if(checkFile){
                //获得Workbook工作薄对象
                Workbook workbook = getWorkBook(file);
                HSSFWorkbook hsBook = new HSSFWorkbook();
                XSSFWorkbook xsBook = new XSSFWorkbook();
                //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
                List<String[]> list = new ArrayList<String[]>();
                if(workbook != null){
                    for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
                        //获得当前sheet工作表
                        Sheet sheet = workbook.getSheetAt(sheetNum);
                        if(sheet == null){
                            continue;
                        }
                        //获得当前sheet的开始行
                        int firstRowNum  = sheet.getFirstRowNum();
                        //获得当前sheet的结束行
                        int lastRowNum = sheet.getLastRowNum();
                        //循环除了第一行的所有行
                        for(int rowNum = firstRowNum+startRow;rowNum <= lastRowNum;rowNum++){
                            //获得当前行
                            Row row = sheet.getRow(rowNum);
                            if(row == null){
                                continue;
                            }
                            //获得当前行的开始列
                            int firstCellNum = row.getFirstCellNum();
                            //获得当前行的列数
                            int lastCellNum = row.getPhysicalNumberOfCells();
                            String[] cells = new String[row.getPhysicalNumberOfCells()];
                            //循环当前行
                            for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
                                Cell cell = row.getCell(cellNum);
                                cells[cellNum] = getCellValue(cell);
                            }
 
                            list.add(cells);
                        }
                    }
                    //((InputStream) workbook).close();
                }
                return list;
            }else{
                return null;
            }
        }
 
    /**
     * 读入excel文件,解析后返回
     * @param file
     * @throws IOException
     */
    public  List<BbEmployee> readExcelBbEmployee(MultipartFile file, Integer startRow) throws IOException{
        //检查文件
        boolean checkFile = checkFile(file);
        if(checkFile){
            //获得Workbook工作薄对象
            Workbook workbook = getWorkBook(file);
            //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
            List<BbEmployee> list = new ArrayList<BbEmployee>();
            if(workbook != null){
                for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
                    //获得当前sheet工作表
                    Sheet sheet = workbook.getSheetAt(sheetNum);
                    if(sheet == null){
                        continue;
                    }
                    //获得当前sheet的开始行
                    int firstRowNum  = sheet.getFirstRowNum();
                    //获得当前sheet的结束行
                    int lastRowNum = sheet.getLastRowNum();
                    //循环除了第一行的所有行
                    for(int rowNum = firstRowNum+startRow;rowNum <= lastRowNum;rowNum++){
                        //获得当前行
                        Row row = sheet.getRow(rowNum);
                        if(row == null){
                            continue;
                        }
 
                        BbEmployee bbEmployee = new BbEmployee();
                        //姓名
                        Cell cellName = row.getCell(0);
                        bbEmployee.setName(getCellValue(cellName));
                        //分库ID
                        Cell cellOrgId = row.getCell(1);
                        bbEmployee.setOrgId(Long.parseLong(getCellValue(cellOrgId)));
                        //组织部门ID
                        Cell cellOfficeId = row.getCell(2);
                        bbEmployee.setOfficeId(Long.parseLong(getCellValue(cellOfficeId)));
                        //身份证号
                        Cell cellCardId = row.getCell(3);
                        bbEmployee.setCardId(getCellValue(cellCardId));
                        //性别
                        Cell cellGender = row.getCell(4);
                        bbEmployee.setGender(getCellValue(cellGender));
                        //民族
                        Cell cellNation = row.getCell(5);
                        bbEmployee.setNation(getCellValue(cellNation));
                        //手机号
                        Cell cellPhone = row.getCell(6);
                        bbEmployee.setPhone(getCellValue(cellPhone));
                        //人员类型
                        Cell cellType = row.getCell(7);
                        bbEmployee.setType(getCellValue(cellType));
 
                        list.add(bbEmployee);
                    }
                }
                //((InputStream) workbook).close();
            }
            return list;
        }else{
            return null;
        }
    }
 
    //判断文件是否为.xls或者.xlsx文件
    public static boolean checkFile(MultipartFile file) throws IOException{
        boolean flag=true;
        //判断文件是否存在  
        if(null == file){  
            flag=false;
            logger.error("文件不存在!");  
            throw new FileNotFoundException("文件不存在!");  
        }  
        //获得文件名  
        String fileName = file.getOriginalFilename();  
        //判断文件是否是excel文件  
        if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){  
            flag=false;
            logger.error(fileName + "不是excel文件");  
            throw new IOException(fileName + "不是excel文件");  
        }
        return flag;  
    }
    
    public static Workbook getWorkBook(MultipartFile file) {
        //获得文件名  
        String fileName = file.getOriginalFilename();  
        //创建Workbook工作薄对象,表示整个excel  
        Workbook workbook = null;  
        try {  
            //获取excel文件的io流  
            InputStream is = file.getInputStream();  
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象  
            if(fileName.endsWith(xls)){  
                //2003  
                workbook = new HSSFWorkbook(is);  
            }else if(fileName.endsWith(xlsx)){  
                //2007  
                workbook = new XSSFWorkbook(is);
               /* XSSFWorkbook sheet = new XSSFWorkbook(is);
                XSSFSheet sheet2 = sheet.getSheetAt(0);
                Map<String, PictureData> map = getSheetPictrues(sheet2);
                byte[] bytes = map.get(1+"").getData();
                String faces = FaceUtil.extractFeature(bytes,null);
                System.out.println(5555);*/
            }  
        } catch (IOException e) {  
            logger.info(e.getMessage());  
        }  
        return workbook;  
    }
 
    //获取 XSSFWorkbook 对象
    public static XSSFWorkbook getXSSFWorkbook(MultipartFile file) {
        //获得文件名
        String fileName = file.getOriginalFilename();
        //创建Workbook工作薄对象,表示整个excel
        XSSFWorkbook workbook = null;
        try {
            //获取excel文件的io流
            InputStream is = file.getInputStream();
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
            workbook = new XSSFWorkbook(is);
 
        } catch (IOException e) {
            logger.info(e.getMessage());
        }
        return workbook;
    }
 
    public static String getCellValue(Cell cell){  
        String cellValue = "";  
        if(cell == null){  
            return cellValue;  
        }  
        //把数字当成String来读,避免出现1读成1.0的情况  
        if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){  
            
            //判断是否是日期类型 如果是日期类型 处理成日期类型
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                Date d = cell.getDateCellValue();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                cellValue=sdf.format(d);
                return cellValue;
            }else{
                cell.setCellType(Cell.CELL_TYPE_STRING); 
            }
                
        }  
        //判断数据的类型  
        switch (cell.getCellType()){  
            case Cell.CELL_TYPE_NUMERIC: //数字  
                cellValue = String.valueOf(cell.getNumericCellValue());  
                break;  
            case Cell.CELL_TYPE_STRING: //字符串  
                cellValue = String.valueOf(cell.getStringCellValue());  
                break;  
            case Cell.CELL_TYPE_BOOLEAN: //Boolean  
                cellValue = String.valueOf(cell.getBooleanCellValue());  
                break;  
            case Cell.CELL_TYPE_FORMULA: //公式  
                cellValue = String.valueOf(cell.getCellFormula());  
                break;  
            case Cell.CELL_TYPE_BLANK: //空值   
                cellValue = "";  
                break;  
            case Cell.CELL_TYPE_ERROR: //故障  
                cellValue = "非法字符";  
                break;  
            default:  
                cellValue = "未知类型";  
                break;  
        }  
        return cellValue;  
    }
 
    /**
     * . 获取Excel2007图片
     *
     * @param sheet 当前sheet对象
     * @return Map key:图片单元格索引(0_1_1)String,value:图片流PictureData
     */
    public static Map<String, PictureData> getSheetPictrues(XSSFSheet sheet) {
        Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();
        for (POIXMLDocumentPart dr : sheet.getRelations()) {
            if (dr instanceof XSSFDrawing) {
                XSSFDrawing drawing = (XSSFDrawing) dr;
                List<XSSFShape> shapes = drawing.getShapes();
                for (XSSFShape shape : shapes) {
                    if (shape instanceof XSSFPicture) {
                        XSSFPicture pic = (XSSFPicture) shape;
                        XSSFClientAnchor anchor = pic.getPreferredSize();
                        CTMarker ctMarker = anchor.getFrom();
                        String picIndex = (ctMarker.getRow()-3)+"";
                        sheetIndexPicMap.put(picIndex, pic.getPictureData());
                    }
                }
            }
        }
        return sheetIndexPicMap;
    }
    /**
     2      * 根据byte数组,生成文件
     3      */
      public static void getFile(byte[] bfile, String filePath,String fileName) {
                 BufferedOutputStream bos = null;
                 FileOutputStream fos = null;
                 File file = null;
                try {
                         File dir = new File(filePath);
                         if(!dir.exists()&&!dir.isDirectory()){//判断文件目录是否存在
                                 dir.mkdirs();
                             }
                         file = new File(filePath+"\\"+fileName);
                         fos = new FileOutputStream(file);
                         bos = new BufferedOutputStream(fos);
                         bos.write(bfile);
                     } catch (Exception e) {
                         e.printStackTrace();
                     } finally {
                         if (bos != null) {
                                 try {
                                         bos.close();
                                     } catch (IOException e1) {
                                         e1.printStackTrace();
                                     }
                            }
                         if (fos != null) {
                                 try {
                                         fos.close();
                                     } catch (IOException e1) {
                                         e1.printStackTrace();
                                     }
                             }
                    }
             }
    // 创建临时文件
    private static File getFileFromBytes(byte[] b, String suffix) {
        BufferedOutputStream stream = null;
        File file = null;
        try {
            file = File.createTempFile("pattern", "." + suffix);
            System.out.println("临时文件位置:"+file.getCanonicalPath());
            FileOutputStream fstream = new FileOutputStream(file);
            stream = new BufferedOutputStream(fstream);
            stream.write(b);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }
 
    public static File byte2File(byte[] buf, String filePath, String fileName)
    {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try
        {
            File dir = new File(filePath);
            if (!dir.exists() && dir.isDirectory())
            {
                dir.mkdirs();
            }
            file = new File(filePath + File.separator + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(buf);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (bos != null)
            {
                try
                {
                    bos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            if (fos != null)
            {
                try
                {
                    fos.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }
}