|
@@ -0,0 +1,337 @@
|
|
|
+package com.ruoyi.common.utils.file;
|
|
|
+
|
|
|
+
|
|
|
+import com.ruoyi.common.config.RuoYiConfig;
|
|
|
+import com.ruoyi.common.constant.Constants;
|
|
|
+import com.ruoyi.common.utils.StringUtils;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFDataFormat;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.ss.util.CellRangeAddress;
|
|
|
+import org.apache.poi.util.IOUtils;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFSheet;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.DecimalFormat;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by Administrator on 2018/7/26 0026.
|
|
|
+ */
|
|
|
+public class ExcelUtils {
|
|
|
+
|
|
|
+ public static void insertPicture(XSSFWorkbook workbook, XSSFSheet sheet, String fileUrl, int row, int col, double scaleX, double scaleY) {
|
|
|
+ try {
|
|
|
+ // 输入流
|
|
|
+ String localPath = RuoYiConfig.getProfile();
|
|
|
+ String imagePath = localPath + StringUtils.substringAfter(fileUrl, Constants.RESOURCE_PREFIX);
|
|
|
+ InputStream is = new FileInputStream(imagePath);
|
|
|
+ byte[] bytes = IOUtils.toByteArray(is);
|
|
|
+ @SuppressWarnings("static-access")
|
|
|
+ int pictureIdx = workbook.addPicture(bytes, workbook.PICTURE_TYPE_PNG);
|
|
|
+ CreationHelper helper = workbook.getCreationHelper();
|
|
|
+ Drawing drawing = sheet.createDrawingPatriarch();
|
|
|
+ ClientAnchor anchor = helper.createClientAnchor();
|
|
|
+ // 图片插入坐标
|
|
|
+ anchor.setCol1(col);
|
|
|
+ anchor.setRow1(row);
|
|
|
+ // 插入图片
|
|
|
+ Picture pict = drawing.createPicture(anchor, pictureIdx);
|
|
|
+ pict.resize(scaleX, scaleY);
|
|
|
+ is.close();
|
|
|
+ } catch (FileNotFoundException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 及2007以上
|
|
|
+ workbook = new XSSFWorkbook(is);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+// log.error(e.getMessage());
|
|
|
+ }
|
|
|
+ return workbook;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static Workbook getWorkBook(File file) {
|
|
|
+ //获得文件名
|
|
|
+ String fileName = file.getName();
|
|
|
+ //创建Workbook工作薄对象,表示整个excel
|
|
|
+ Workbook workbook = null;
|
|
|
+ try {
|
|
|
+ //获取excel文件的io流
|
|
|
+ InputStream is =new FileInputStream(file);
|
|
|
+ //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
|
|
|
+ if (fileName.endsWith("xls")) {
|
|
|
+ //2003
|
|
|
+ workbook = new HSSFWorkbook(is);
|
|
|
+ } else if (fileName.endsWith("xlsx")) {
|
|
|
+ //2007 及2007以上
|
|
|
+ workbook = new XSSFWorkbook(is);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+// log.error(e.getMessage());
|
|
|
+ }
|
|
|
+ return workbook;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getCellValue(Cell cell) {
|
|
|
+ String cellValue = "";
|
|
|
+ if (cell == null) {
|
|
|
+ return cellValue;
|
|
|
+ }
|
|
|
+ System.out.println("Excel格式:"+ cell.getCellType().name());
|
|
|
+
|
|
|
+ switch (cell.getCellType().name()) {
|
|
|
+ case "STRING":
|
|
|
+ cellValue = cell.getRichStringCellValue().getString();
|
|
|
+ break;
|
|
|
+ case "NUMERIC":
|
|
|
+ System.out.println("Excel数据样式:"+ cell.getCellStyle().getDataFormatString());
|
|
|
+ if("General".equals(cell.getCellStyle().getDataFormatString())){
|
|
|
+ cellValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
|
|
|
+ }else if("m/d/yyyy;@".equals(cell.getCellStyle().getDataFormatString())){
|
|
|
+ cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
|
|
|
+ }else if("@".equals(cell.getCellStyle().getDataFormatString())){
|
|
|
+ cellValue = cell.getNumericCellValue() + "";
|
|
|
+ }else if(cell.getCellStyle().getDataFormatString().indexOf("0_") > -1){
|
|
|
+ //数字非日期
|
|
|
+ System.out.println("Excel值:"+ cell.getNumericCellValue());
|
|
|
+ cellValue = cell.getNumericCellValue() + "";
|
|
|
+ }else{
|
|
|
+ try {
|
|
|
+ cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
|
|
|
+ }catch (Exception e){
|
|
|
+ cellValue = cell.getNumericCellValue() + "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case "BLANK":
|
|
|
+ cellValue = "";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cellValue = cell.toString();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //判断数据的类型
|
|
|
+// switch (cell.getCellType()) {
|
|
|
+// case Cell.CELL_TYPE_NUMERIC: //数字
|
|
|
+// cellValue = stringDateProcess(cell);
|
|
|
+// 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;
|
|
|
+// }
|
|
|
+// cellValue = String.valueOf(cell.getStringCellValue());
|
|
|
+ return cellValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 时间格式处理
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ * @author Liu Xin Nan
|
|
|
+ * @data 2017年11月27日
|
|
|
+ */
|
|
|
+ public static String stringDateProcess(Cell cell) {
|
|
|
+ String result = new String();
|
|
|
+ if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
|
|
|
+ SimpleDateFormat sdf = null;
|
|
|
+ if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
|
|
|
+ sdf = new SimpleDateFormat("HH:mm");
|
|
|
+ } else {// 日期
|
|
|
+ sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
|
|
|
+ }
|
|
|
+ Date date = cell.getDateCellValue();
|
|
|
+ result = sdf.format(date);
|
|
|
+ } else if (cell.getCellStyle().getDataFormat() == 58) {
|
|
|
+ // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
|
|
|
+ double value = cell.getNumericCellValue();
|
|
|
+ Date date = DateUtil
|
|
|
+ .getJavaDate(value);
|
|
|
+ result = sdf.format(date);
|
|
|
+ } else {
|
|
|
+ double value = cell.getNumericCellValue();
|
|
|
+ CellStyle style = cell.getCellStyle();
|
|
|
+ DecimalFormat format = new DecimalFormat();
|
|
|
+ String temp = style.getDataFormatString();
|
|
|
+ // 单元格设置成常规
|
|
|
+ if (temp.equals("General")) {
|
|
|
+ format.applyPattern("#");
|
|
|
+ }
|
|
|
+ result = format.format(value);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合并单元格处理,获取合并行
|
|
|
+ *
|
|
|
+ * @param sheet
|
|
|
+ * @return List<CellRangeAddress>
|
|
|
+ */
|
|
|
+ public static List<CellRangeAddress> getCombineCell(Sheet sheet) {
|
|
|
+ List<CellRangeAddress> list = new ArrayList<CellRangeAddress>();
|
|
|
+ //获得一个 sheet 中合并单元格的数量
|
|
|
+ int sheetmergerCount = sheet.getNumMergedRegions();
|
|
|
+ //遍历所有的合并单元格
|
|
|
+ for (int i = 0; i < sheetmergerCount; i++) {
|
|
|
+ //获得合并单元格保存进list中
|
|
|
+ CellRangeAddress ca = sheet.getMergedRegion(i);
|
|
|
+ list.add(ca);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static int getRowNum(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet) {
|
|
|
+ int xr = 0;
|
|
|
+ int firstC = 0;
|
|
|
+ int lastC = 0;
|
|
|
+ int firstR = 0;
|
|
|
+ int lastR = 0;
|
|
|
+ for (CellRangeAddress ca : listCombineCell) {
|
|
|
+ //获得合并单元格的起始行, 结束行, 起始列, 结束列
|
|
|
+ firstC = ca.getFirstColumn();
|
|
|
+ lastC = ca.getLastColumn();
|
|
|
+ firstR = ca.getFirstRow();
|
|
|
+ lastR = ca.getLastRow();
|
|
|
+ if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {
|
|
|
+ if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {
|
|
|
+ xr = lastR;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return xr;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断单元格是否为合并单元格,是的话则将单元格的值返回
|
|
|
+ *
|
|
|
+ * @param listCombineCell 存放合并单元格的list
|
|
|
+ * @param cell 需要判断的单元格
|
|
|
+ * @param sheet sheet
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String isCombineCell(List<CellRangeAddress> listCombineCell, Cell cell, Sheet sheet)
|
|
|
+ throws Exception {
|
|
|
+ int firstC = 0;
|
|
|
+ int lastC = 0;
|
|
|
+ int firstR = 0;
|
|
|
+ int lastR = 0;
|
|
|
+ String cellValue = null;
|
|
|
+ for (CellRangeAddress ca : listCombineCell) {
|
|
|
+ //获得合并单元格的起始行, 结束行, 起始列, 结束列
|
|
|
+ firstC = ca.getFirstColumn();
|
|
|
+ lastC = ca.getLastColumn();
|
|
|
+ firstR = ca.getFirstRow();
|
|
|
+ lastR = ca.getLastRow();
|
|
|
+ if (cell.getRowIndex() >= firstR && cell.getRowIndex() <= lastR) {
|
|
|
+ if (cell.getColumnIndex() >= firstC && cell.getColumnIndex() <= lastC) {
|
|
|
+ Row fRow = sheet.getRow(firstR);
|
|
|
+ Cell fCell = fRow.getCell(firstC);
|
|
|
+ cellValue = getCellValue(fCell);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ cellValue = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return cellValue;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取合并单元格的值
|
|
|
+ *
|
|
|
+ * @param sheet
|
|
|
+ * @param row
|
|
|
+ * @param column
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getMergedRegionValue(Sheet sheet, int row, int column) {
|
|
|
+ int sheetMergeCount = sheet.getNumMergedRegions();
|
|
|
+
|
|
|
+ for (int i = 0; i < sheetMergeCount; i++) {
|
|
|
+ CellRangeAddress ca = sheet.getMergedRegion(i);
|
|
|
+ int firstColumn = ca.getFirstColumn();
|
|
|
+ int lastColumn = ca.getLastColumn();
|
|
|
+ int firstRow = ca.getFirstRow();
|
|
|
+ int lastRow = ca.getLastRow();
|
|
|
+
|
|
|
+ if (row >= firstRow && row <= lastRow) {
|
|
|
+ if (column >= firstColumn && column <= lastColumn) {
|
|
|
+ Row fRow = sheet.getRow(firstRow);
|
|
|
+ Cell fCell = fRow.getCell(firstColumn);
|
|
|
+ return getCellValue(fCell);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断指定的单元格是否是合并单元格
|
|
|
+ *
|
|
|
+ * @param sheet
|
|
|
+ * @param row 行下标
|
|
|
+ * @param column 列下标
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean isMergedRegion(Sheet sheet, int row, int column) {
|
|
|
+ int sheetMergeCount = sheet.getNumMergedRegions();
|
|
|
+ for (int i = 0; i < sheetMergeCount; i++) {
|
|
|
+ CellRangeAddress range = sheet.getMergedRegion(i);
|
|
|
+ int firstColumn = range.getFirstColumn();
|
|
|
+ int lastColumn = range.getLastColumn();
|
|
|
+ int firstRow = range.getFirstRow();
|
|
|
+ int lastRow = range.getLastRow();
|
|
|
+ if (row >= firstRow && row <= lastRow) {
|
|
|
+ if (column >= firstColumn && column <= lastColumn) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|