添加依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
检查文件类型
public static void checkFile(MultipartFile file) throws IOException{
if(null == file){
throw new FileNotFoundException("文件不存在!");
}
String fileName = file.getOriginalFilename();
if(!fileName.endsWith("xls") && !fileName.endsWith("xlsx")){
throw new IOException(fileName + "不是excel文件");
}
}
获得工作簿(Workbook)
public static Workbook getWorkBook(MultipartFile file) {
String fileName = file.getOriginalFilename();
Workbook workbook = null;//创建Workbook工作薄对象,表示整个excel
try {
InputStream is = file.getInputStream();
//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
if(fileName.endsWith("xls")){
workbook = new HSSFWorkbook(is);//2003
}else if(fileName.endsWith("xlsx")){
workbook = new XSSFWorkbook(is);//2007
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
return workbook;
}
获得单元格的字符串值
public static String getCellValue(Cell cell){
String cellValue = "";
if(cell == null){
return cellValue;
}
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){//把数字当成String来读,避免出现1读成1.0的情况
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;
}
由整个excell转化为List<String[]>
public static List<String[]> readExcel(MultipartFile files) throws IOException {
//检查文件
checkFile(files);
//获得Workbook工作薄对象
Workbook workbook = getWorkBook(files);
//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
List<String[]> list = new ArrayList<>();
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 + 1; rowNum <= lastRowNum; rowNum++) {
//获得当前行
Row row = sheet.getRow(rowNum);
if (row == null || row.getPhysicalNumberOfCells() == 0) {
continue;
}
//获得当前行的开始列
int firstCellNum = row.getFirstCellNum();
//获得当前行的结束列
int lastCellNum = row.getLastCellNum();
String[] cells = new String[lastCellNum];
//循环当前行
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
Cell cell = row.getCell(cellNum);
if (null == cell){
cells[cellNum] = "";
continue;
}
String guarantee_date = "";
//判断是否为日期类型
if (0 == cell.getCellType()) {
if (DateUtil.isCellDateFormatted(cell)) {
//用于转化为日期格式
Date d = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
guarantee_date = formater.format(d);
cells[cellNum] = guarantee_date;
} else {
int num = (int) cell.getNumericCellValue();
cells[cellNum] = String.valueOf(num);
}
} else {
cells[cellNum] = getCellValue(cell);
}
}
list.add(cells);
}
}
}
return list;
}
如果读取到的日期为数字的话,使用下面方法转化
private Date getDateFromExcelNumber(String number) {
Calendar calendar = new GregorianCalendar(1900, 0, -1);
Date d = calendar.getTime();
return DateUtils.addDays(d, Integer.valueOf(number));
}
以上是读取excel文件的,下面是生成excel文件!
创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();//2007
创建sheet页
XSSFSheet sheet = workbook.createSheet("sheet页的名称");
单元格属性设置
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStale.setWrapText(true);//设置自动换行
cellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());//背景色
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);//填充背景色
XSSFFont font= workbook.createFont();
font.setFontName("Calibri");
font.setFontHeightInPoints((short) 10);//设置字体大小
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);//粗体显示
cellStyle.setFont(font);//选择需要用到的字体格式
时间类型的数据格式设置
cellStyle.setDataFormat(
workbook.getCreationHelper().createDataFormat().getFormat("yyyy/mm/dd")
);
设置列宽
sheet.setDefaultColumnWidth((short) 12);// 设置表格默认列宽度为10个字节
sheet.setColumnWidth(0, 6*256);// 第一列设置6个字节宽度
新建一行,设置行高
XSSFRow row = sheet.createRow(0);//第一行,一般是标题行,需要单独的样式
row.setHeight((short) (40*15.625));
设置标题行文字和样式(其余行以此类推)
String[] headers = {"序号","标题列1","标题列2","标题列3","标题列4","标题列5", "标题列6"};
for (short i = 0; i < headers.length; i++) {
XSSFCell cell = row.createCell(i);//新建单元格
XSSFRichTextString text = new XSSFRichTextString(headers[i]);
cell.setCellValue(text);//设置文本
cell.setCellStyle(titleStyle);//设置样式
}
保存文件
String filePath = "路径和文件名.xlsx";
FileOutputStream fileOutputStream = new FileOutputStream(filePath);//指定路径与名字和格式
workbook.write(fileOutputStream);//将数据写出去
fileOutputStream.close();//关闭输出流
下载文件到客户端
参考自:https://blog.csdn.net/fengchao2016/article/details/55188805
https://blog.csdn.net/wanghaoqian/article/details/78284654
private static void downloadFile(File file, HttpServletRequest request,HttpServletResponse response) {
String fileName = "中文.xlsx";
InputStream fin = null;
ServletOutputStream out = null;
try {
fin = new FileInputStream(file);
out = response.getOutputStream();
response.setCharacterEncoding("utf-8");
response.setContentType("application/octet-stream");
boolean isMSIE = isMSBrowser(request);
if (isMSIE) {
//IE浏览器的乱码问题解决
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
//万能乱码问题解决
fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
}
response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");
byte[] buffer = new byte[1024];
int bytesToRead = -1;
// 通过循环将读入的Word文件的内容输出到浏览器中
while((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(fin != null) {
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
private static boolean isMSBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal))
return true;
}
return false;
}
觉得有用的老铁给个双击!