1.引入maven依赖
1 <dependency> 2 <groupId>net.sourceforge.jexcelapi</groupId> 3 <artifactId>jxl</artifactId> 4 <version>2.6.12</version> 5 </dependency>
2.测试方法
1 private static final String BOX_PATH = "C:\demo\box.xls"; 2 private static final String LAMP_1_PATH = "C:\demo\lamp1.xls"; 3 private static final String LAMP_2_PATH = "C:\demo\lamp2.xls"; 4 private static final String FILE_PATH = "C:\demo\test.xls"; 5 @Test 6 public void test() { 7 System.out.println("开始时间: ==> " + new Date().getTime()); 8 9 // 读取Excel 10 List<List<Object>> lists = readExcel(); 11 12 // 写出Excel 13 writeExcel(lists); 14 15 System.out.println("结束时间: ==> " + new Date().getTime()); 16 }
3.读取Excel
1 public List<List<Object>> readExcel() { 2 try { 3 // 创建输入流, 读取box.xls 4 InputStream box = new FileInputStream(BOX_PATH); 5 // 获取box.xls文件对象 6 Workbook boxExcel = Workbook.getWorkbook(box); 7 // 获取box.xls文件的指定工作表, 默认的第一个 8 Sheet boxSheet = boxExcel.getSheet(0); 9 10 // 定义一个集合存放box结果 11 List<Map<String, String>> boxList = new ArrayList<>(); 12 // 读取每一行 13 for (int i = 0; i < boxSheet.getRows(); i++) { 14 // 存放每一行结果 15 Map<String, String> boxCells = new HashMap<>(); 16 String key = ""; 17 String val = ""; 18 // 读取每一列 19 for (int j = 0; j < boxSheet.getColumns(); j++) { 20 // box.xls文件的第I行第J列 21 Cell boxCell = boxSheet.getCell(j, i); 22 // 将boxNo作为value 23 if (j == 0) { 24 val = boxCell.getContents(); 25 } 26 // 将boxName作为key 27 if (j == 1) { 28 key = boxCell.getContents(); 29 } 30 } 31 boxCells.put(key, val); 32 boxList.add(boxCells); 33 } 34 // 读取完box.xls后释放资源 35 boxExcel.close(); 36 37 // 定义一个集合存放所有符合条件的结果 38 List<List<Object>> lampList = new ArrayList<>(); 39 40 // 创建输入流, 读取lamp1.xls 41 InputStream lamp_1 = new FileInputStream(LAMP_1_PATH); 42 // 获取lamp1.xls文件对象 43 Workbook lamp_1_Excel = Workbook.getWorkbook(lamp_1); 44 // 获取lamp1.xls文件的指定工作表, 默认的第一个 45 Sheet lamp_1_Sheet = lamp_1_Excel.getSheet(0); 46 47 // 读取lamp.xls, 将所有的符合条件的结果存放到集合里面 48 for (int i = 0; i < lamp_1_Sheet.getRows(); i++) { 49 for (int j = 0; j < lamp_1_Sheet.getColumns(); j++) { 50 Cell lampCell = lamp_1_Sheet.getCell(j, i); 51 // 当前列是第3列时 52 if (j == 2) { 53 Integer num = Integer.valueOf(lampCell.getContents()); 54 if (num >= 250) { 55 List<Object> lampCells = new ArrayList<>(); 56 String lampNo = lamp_1_Sheet.getCell(0, i).getContents(); 57 String boxName = lamp_1_Sheet.getCell(1, i).getContents(); 58 String rawData = lamp_1_Sheet.getCell(2, i).getContents(); 59 // 拿取box数据 60 for (Map<String, String> map : boxList) { 61 Set<String> keySet = map.keySet(); 62 for (String key : keySet) { 63 if (boxName.equals(key)) { 64 String val = map.get(key); 65 // boxNo 66 lampCells.add(val); 67 // boxName 68 lampCells.add(key); 69 // lampNo 70 lampCells.add(lampNo); 71 // 灯泡个数 72 lampCells.add(1); 73 // 总功率 74 lampCells.add(num); 75 // 原始数据 76 lampCells.add(rawData); 77 } 78 } 79 } 80 81 lampList.add(lampCells); 82 } 83 } 84 } 85 } 86 // 读取完lamp.xls后释放资源 87 lamp_1_Excel.close(); 88 89 // 创建输入流, 读取lamp1.xls 90 InputStream lamp_2 = new FileInputStream(LAMP_2_PATH); 91 // 获取lamp1.xls文件对象 92 Workbook lamp_2_Excel = Workbook.getWorkbook(lamp_2); 93 // 获取lamp1.xls文件的指定工作表, 默认的第一个 94 Sheet lamp_2_Sheet = lamp_2_Excel.getSheet(0); 95 96 // 读取lamp.xls, 将所有的符合条件的结果存放到集合里面 97 for (int i = 0; i < lamp_2_Sheet.getRows(); i++) { 98 for (int j = 0; j < lamp_2_Sheet.getColumns(); j++) { 99 Cell lampCell = lamp_2_Sheet.getCell(j, i); 100 // 当前列是第3列时 101 if (j == 2) { 102 Integer num = 0; 103 String contents = lampCell.getContents(); 104 String[] split = contents.split("-"); 105 for (String str : split) { 106 Integer integer = Integer.valueOf(str); 107 num += integer; 108 } 109 if (num >= 400) { 110 List<Object> lampCells = new ArrayList<>(); // 存放每一行符合条件的结果 111 String lampNo = lamp_2_Sheet.getCell(0, i).getContents(); 112 String boxName = lamp_2_Sheet.getCell(1, i).getContents(); 113 String rawData = lamp_2_Sheet.getCell(2, i).getContents(); 114 // 拿取box数据 115 for (Map<String, String> map : boxList) { 116 Set<String> keySet = map.keySet(); 117 for (String key : keySet) { 118 if (boxName.equals(key)) { 119 String val = map.get(key); 120 // boxNo 121 lampCells.add(val); 122 // boxName 123 lampCells.add(key); 124 // lampNo 125 lampCells.add(lampNo); 126 // 灯泡个数 127 lampCells.add(split.length); 128 // 总功率 129 lampCells.add(num); 130 // 原始数据 131 lampCells.add(rawData); 132 } 133 } 134 } 135 lampList.add(lampCells); 136 } 137 } 138 } 139 } 140 // 读取完lamp.xls后释放资源 141 lamp_2_Excel.close(); 142 143 return lampList; 144 } catch (Exception e) { 145 throw new RuntimeException(e); 146 } 147 }
4.写出Excel
1 public void writeExcel(List<List<Object>> arrayLists) { 2 try { 3 String[] title = {"序号", "rtuNo", "rtuName", "灯杆name", "盏数", "总功率", "原始数据", "计算时间"}; 4 // 新建立一个jxl文件 5 OutputStream os = new FileOutputStream(FILE_PATH); 6 // 创建Excel工作薄 7 WritableWorkbook workbook = Workbook.createWorkbook(os); 8 // 添加第一个工作表并设置第一个Sheet的名字 9 WritableSheet sheet = workbook.createSheet("sheet", 0); 10 Label label; 11 for (int m = 0; m < title.length; m++) { 12 // Label(x,y,z) 代表单元格的第x+1列,第y+1行, 内容z, 在Label对象的子对象中指明单元格的位置和内容 13 label = new Label(m, 0, title[m], getHeader()); 14 // 将定义好的单元格添加到工作表中 15 sheet.addCell(label); 16 } 17 for (int i = 0; i < arrayLists.size(); i++) { 18 Number number = new Number(0, i + 1, i + 1); 19 sheet.addCell(number); 20 List list = arrayLists.get(i); 21 for (int j = 0; j < list.size(); j++) { 22 label = new Label(j + 1, i + 1, String.valueOf(list.get(j))); 23 sheet.addCell(label); 24 } 25 // 事件类型 26 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 27 String newdate = sdf.format(new Date()); 28 label = new Label(7, i + 1, newdate); 29 sheet.addCell(label); 30 } 31 // 写入数据 32 workbook.write(); 33 // 关闭文件 34 workbook.close(); 35 } catch (Exception e) { 36 throw new RuntimeException(e); 37 } 38 }
5.特殊格式
public static WritableCellFormat getHeader() { WritableFont font = new WritableFont(WritableFont.TIMES, 10, WritableFont.BOLD);//定义字体 try { font.setColour(Colour.BLUE);//蓝色字体 } catch (WriteException e1) { e1.printStackTrace(); } WritableCellFormat format = new WritableCellFormat(font); try { format.setAlignment(jxl.format.Alignment.CENTRE);//左右居中 format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);//上下居中 format.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);//黑色边框 format.setBackground(Colour.YELLOW);//黄色背景 } catch (WriteException e) { e.printStackTrace(); } return format; }
box.xls
lamp1.xls
lamp2.xls
...