使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法
PoiExcelUtils.java
/**
*
*/
package com.common.office;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import net.sf.json.JSONArray;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import com.common.reflect.ReflectUtils;
/**
* Excel工具类
* @author luolin
*/
public class PoiExcelUtils {
private static NumberFormat format = NumberFormat.getInstance();
/** 日志 */
private static final Logger LOGGER = Logger.getLogger(PoiExcelUtils.class);
/** 列默认宽度 */
private static final int DEFAUL_COLUMN_WIDTH = 4000;
/**
* 1.创建 workbook
*
* @return {@link HSSFWorkbook}
*/
private HSSFWorkbook getHSSFWorkbook() {
LOGGER.info("【创建 workbook】");
return new HSSFWorkbook();
}
/**
* 2.创建 sheet
*
* @param hssfWorkbook {@link HSSFWorkbook}
* @param sheetName sheet 名称
* @return {@link HSSFSheet}
*/
private HSSFSheet getHSSFSheet(HSSFWorkbook hssfWorkbook, String sheetName) {
LOGGER.info("【创建 sheet】sheetName : " + sheetName);
return hssfWorkbook.createSheet(sheetName);
}
/**
* 3.写入表头信息
*
* @param hssfWorkbook {@link HSSFWorkbook}
* @param hssfSheet {@link HSSFSheet}
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param title 标题
*/
private void writeHeader(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers, String title) {
LOGGER.info("【写入表头信息】");
// 头信息处理
String[] newHeaders = headersHandler(headers);
// 初始化标题和表头单元格样式
HSSFCellStyle titleCellStyle = createTitleCellStyle(hssfWorkbook);
// 标题栏
HSSFRow titleRow = hssfSheet.createRow(0);
titleRow.setHeight((short) 500);
HSSFCell titleCell = titleRow.createCell(0);
// 设置标题文本
titleCell.setCellValue(new HSSFRichTextString(title));
// 设置单元格样式
titleCell.setCellStyle(titleCellStyle);
// 处理单元格合并,四个参数分别是:起始行,终止行,起始行,终止列
hssfSheet.addMergedRegion(new CellRangeAddress(0, 0, (short) 0, (short) (newHeaders.length - 1)));
// 设置合并后的单元格的样式
titleRow.createCell(newHeaders.length - 1).setCellStyle(titleCellStyle);
// 表头
HSSFRow headRow = hssfSheet.createRow(1);
headRow.setHeight((short) 500);
HSSFCell headCell = null;
String[] headInfo = null;
// 处理excel表头
for (int i = 0, len = newHeaders.length; i < len; i++) {
headInfo = newHeaders[i].split("@");
headCell = headRow.createCell(i);
headCell.setCellValue(headInfo[0]);
headCell.setCellStyle(titleCellStyle);
// 设置列宽度
setColumnWidth(i, headInfo, hssfSheet);
}
}
/**
* 头信息校验和处理
* @param headers
*/
private String[] headersHandler(String[] headers) {
List<String> newHeaders = new ArrayList<String>();
for (String string : headers) {
if (StringUtils.isNotBlank(string)) {
newHeaders.add(string);
}
}
int size = newHeaders.size();
return newHeaders.toArray(new String[size]);
}
/**
* 4.写入内容部分
*
* @param hssfWorkbook {@link HSSFWorkbook}
* @param hssfSheet {@link HSSFSheet}
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出的数据集合
* @throws Exception
*/
private void writeContent(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers, List<?> dataList)
throws Exception {
LOGGER.info("【写入Excel内容部分】");
// 2015-8-13 增加,当没有数据的时候,把原来抛异常的方式修改成返回一个只有头信息,没有数据的空Excel
if (CollectionUtils.isEmpty(dataList)) {
LOGGER.warn("【没有内容数据】");
return;
}
HSSFRow row = null;
HSSFCell cell = null;
// 单元格的值
Object cellValue = null;
// 数据写入行索引
int rownum = 2;
// 单元格样式
HSSFCellStyle cellStyle = createContentCellStyle(hssfWorkbook);
// 遍历集合,处理数据
for (int j = 0, size = dataList.size(); j < size; j++) {
row = hssfSheet.createRow(rownum);
for (int i = 0, len = headers.length; i < len; i++) {
cell = row.createCell(i);
cellValue = ReflectUtils.getCellValue(dataList.get(j), headers[i].split("@")[1]);
cellValueHandler(cell, cellValue);
cell.setCellStyle(cellStyle);
}
rownum++;
}
}
/**
* 设置列宽度
* @param i 列的索引号
* @param headInfo 表头信息,其中包含了用户需要设置的列宽
*/
private void setColumnWidth(int i, String[] headInfo, HSSFSheet hssfSheet) {
if (headInfo.length < 3) {
// 用户没有设置列宽,使用默认宽度
hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
return;
}
if (StringUtils.isBlank(headInfo[2])) {
// 使用默认宽度
hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
return;
}
// 使用用户设置的列宽进行设置
hssfSheet.setColumnWidth(i, Integer.parseInt(headInfo[2]));
}
/**
* 单元格写值处理器
* @param {{@link HSSFCell}
* @param cellValue 单元格值
*/
private void cellValueHandler(HSSFCell cell, Object cellValue) {
// 2015-8-13 修改,判断cellValue是否为空,否则在cellValue.toString()会出现空指针异常
if (cellValue == null) {
cell.setCellValue("");
return;
}
if (cellValue instanceof String) {
cell.setCellValue((String) cellValue);
} else if (cellValue instanceof Boolean) {
cell.setCellValue((Boolean) cellValue);
} else if (cellValue instanceof Calendar) {
cell.setCellValue((Calendar) cellValue);
} else if (cellValue instanceof Double) {
cell.setCellValue((Double) cellValue);
} else if (cellValue instanceof Integer || cellValue instanceof Long || cellValue instanceof Short
|| cellValue instanceof Float) {
cell.setCellValue((Double.parseDouble(cellValue.toString())));
} else if (cellValue instanceof HSSFRichTextString) {
cell.setCellValue((HSSFRichTextString) cellValue);
}
cell.setCellValue(cellValue.toString());
}
/**
* 创建标题和表头单元格样式
* @param hssfWorkbook {@link HSSFWorkbook}
* @return {@link HSSFCellStyle}
*/
private HSSFCellStyle createTitleCellStyle(HSSFWorkbook hssfWorkbook) {
LOGGER.info("【创建标题和表头单元格样式】");
// 单元格的样式
HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
// 设置字体样式,改为不变粗
HSSFFont font = hssfWorkbook.createFont();
font.setFontHeightInPoints((short) 13);
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
cellStyle.setFont(font);
// 单元格垂直居中
cellStyle.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
// 设置通用的单元格属性
setCommonCellStyle(cellStyle);
return cellStyle;
}
/**
* 创建内容单元格样式
* @param hssfWorkbook {@link HSSFWorkbook}
* @return {@link HSSFCellStyle}
*/
private HSSFCellStyle createContentCellStyle(HSSFWorkbook hssfWorkbook) {
LOGGER.info("【创建内容单元格样式】");
// 单元格的样式
HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
// 设置字体样式,改为不变粗
HSSFFont font = hssfWorkbook.createFont();
font.setFontHeightInPoints((short) 11);
cellStyle.setFont(font);
// 设置单元格自动换行
cellStyle.setWrapText(true);
// 单元格垂直居中
cellStyle.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
//水平居中
// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置通用的单元格属性
setCommonCellStyle(cellStyle);
return cellStyle;
}
/**
* 设置通用的单元格属性
* @param cellStyle 要设置属性的单元格
*/
private void setCommonCellStyle(HSSFCellStyle cellStyle) {
// 居中
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
// 设置边框
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
}
/**
* 将生成的Excel输出到指定目录
* @param hssfWorkbook {@link HSSFWorkbook}
* @param filePath 文件输出目录,包括文件名(.xls)
*/
private void write2FilePath(HSSFWorkbook hssfWorkbook, String filePath) {
LOGGER.info("【将生成的Excel输出到指定目录】filePath :" + filePath);
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(filePath);
hssfWorkbook.write(fileOut);
} catch (Exception e) {
LOGGER.error("【将生成的Excel输出到指定目录失败】", e);
throw new RuntimeException("将生成的Excel输出到指定目录失败");
} finally {
IOUtils.closeQuietly(fileOut);
}
}
/**
* 生成Excel,存放到指定目录
* @param sheetName sheet名称
* @param title 标题
* @param filePath 要导出的Excel存放的文件路径
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出数据的集合
* @throws Exception
*/
public static void createExcel2FilePath(String sheetName, String title, String filePath, String[] headers,
List<?> dataList) throws Exception {
LOGGER.info("【生成Excel,并存放到指定文件夹目录下】sheetName : " + sheetName + " , title : " + title + " , filePath : "
+ filePath + " , headers : " + JSONArray.fromObject(headers));
if (ArrayUtils.isEmpty(headers)) {
LOGGER.warn("【表头为空】");
throw new RuntimeException("表头不能为空");
}
PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
// 1.创建 Workbook
HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
// 2.创建 Sheet
HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
// 3.写入 head
poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
// 4.写入内容
poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);
// 5.保存文件到filePath中
poiExcelUtil.write2FilePath(hssfWorkbook, filePath);
}
/**
* 生成Excel的WorkBook,用于导出Excel
* @param sheetName sheet名称
* @param title 标题
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出数据的集合
* @throws Exception
*/
public static HSSFWorkbook createExcel2Export(String sheetName, String title, String[] headers, List<?> dataList)
throws Exception {
LOGGER.info("【生成Excel的WorkBook,用于导出Excel】sheetName : " + sheetName + " , title : " + title + " , headers : "
+ JSONArray.fromObject(headers));
if (ArrayUtils.isEmpty(headers)) {
LOGGER.warn("【表头为空】");
throw new RuntimeException("表头不能为空");
}
PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
// 1.创建 Workbook
HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
// 2.创建 Sheet
HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
// 3.写入 head
poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
// 4.写入内容
poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);
return hssfWorkbook;
}
/**
* 创建知识库TOP3系统渠道统计的Excel数据
* @param sheetName sheet名称
* @param title 标题
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出数据的集合
*/
public static HSSFWorkbook createknowledgeTop3Excel(String sheetName, String title, String[] headers,
List<List<?>> dataList) {
LOGGER.info("【生成Excel的WorkBook,用于导出Excel】sheetName : " + sheetName + " , title : " + title + " , headers : "
+ JSONArray.fromObject(headers));
if (ArrayUtils.isEmpty(headers)) {
LOGGER.warn("【表头为空】");
throw new RuntimeException("表头不能为空");
}
PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
// 1.创建 Workbook
HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
// 2.创建 Sheet
HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
// 3.写入 head
poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
// 4.写入内容
try {
poiExcelUtil.writeComplexContent(hssfWorkbook, hssfSheet, headers, dataList);
} catch (Exception e) {
LOGGER.error("【写入内容部分失败】", e);
throw new RuntimeException("写入内容部分失败");
}
return hssfWorkbook;
}
/**
* 生成内容部分(复杂内容,每列来自不同的数据集合)
* @param hssfWorkbook {@link HSSFWorkbook}
* @param hssfSheet {@link HSSFSheet}
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出数据的集合
* @throws Exception
*/
private void writeComplexContent(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers,
List<List<?>> dataList) throws Exception {
LOGGER.info("【写入Excel内容部分】");
// 2015-8-13 增加,当没有数据的时候,把原来抛异常的方式修改成返回一个只有头信息,没有数据的空Excel
if (CollectionUtils.isEmpty(dataList)) {
LOGGER.warn("【没有内容数据】");
return;
}
HSSFRow row = null;
HSSFCell cell = null;
// 单元格的值
Object cellValue = null;
// 数据写入行索引
int rownum = 2;
// 单元格样式
HSSFCellStyle cellStyle = createContentCellStyle(hssfWorkbook);
// 遍历集合,处理数据
// 要写的内容的行数
int rows = dataList.get(0).size();
// 除去固定列“日期”外,还需要写的列数
int columns = dataList.size();
/**
* 思路说明
* 如果是top3,那么dataList的长度应该是3(即除去固定列“日期”剩下的列数)
* 其次索引依次是top1的数据、top2的数据、top3的数据
* top1/top2/top3的数据长度表示行数
* 第一层循环,肯定以行数为基准来进行
* 然后第一层循环的第一步是完成固定列的数据填充
* 第二步是填充对应行每个列的数据,而每个列的数据应该分别从top1、top2、top3中取
*/
for (int j = 0; j < rows; j++) {
row = hssfSheet.createRow(rownum);
// 写固定列“日期”
cell = row.createCell(0);
cellValue = ReflectUtils.getCellValue(dataList.get(0).get(j), headers[0].split("@")[1]);
cellValueHandler(cell, cellValue);
cell.setCellStyle(cellStyle);
for (int i = 1; i <= columns; i++) {
cell = row.createCell(i);
cellValue = ReflectUtils.getCellValue(dataList.get(i - 1).get(j), headers[i].split("@")[1]);
cellValueHandler(cell, cellValue);
cell.setCellStyle(cellStyle);
}
rownum++;
}
}
/**
* 根据文件路径读取excel文件
* @param excelPath excel的路径
* @param skipRows 需要跳过的行数
* @return List<String[]> 集合中每一个元素是一个数组,按单元格索引存储每个单元格的值,一个元素可以封装成一个需要的java bean
* @throws Exception
*/
public static List<String[]> readExcel(String excelPath, int skipRows, int columCount) throws Exception {
LOGGER.info("【读取Excel】excelPath : " + excelPath + " , skipRows : " + skipRows);
FileInputStream is = new FileInputStream(new File(excelPath));
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs);
List<String[]> list = new ArrayList<String[]>();
HSSFSheet sheet = wb.getSheetAt(0);
// 得到总共的行数
int rowNum = sheet.getPhysicalNumberOfRows();
try {
for (int i = skipRows; i < rowNum; i++) {
String[] vals = new String[columCount];
HSSFRow row = sheet.getRow(i);
if (null == row) {
continue;
}
for (int j = 0; j < columCount; j++) {
HSSFCell cell = row.getCell(j);
String val = getStringCellValue(cell);
vals[j] = val;
}
list.add(vals);
}
} catch (Exception e) {
LOGGER.error("【Excel解析失败】", e);
throw new RuntimeException("Excel解析失败");
} finally {
wb.close();
}
return list;
}
/**
* 获取单元格数据内容为字符串类型的数据
*
* @param cell Excel单元格
* @return String 单元格数据内容
*/
private static String getStringCellValue(HSSFCell cell) {
if (cell == null)
return "";
String strCell = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
strCell = String.valueOf(format.format(cell.getNumericCellValue())).replace(",", "");
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
strCell = "";
break;
default:
strCell = "";
break;
}
if (strCell.equals("") || strCell == null) {
return "";
}
return strCell;
}
/**
* 生成车票销售总量统计表格
* @param sheetName sheet名称
* @param title 标题
* @param headers 列标题,数组形式,
* 如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
* 其中参数@columnWidth可选,columnWidth为整型数值
* @param dataList 要导出数据的集合
* @return {@link HSSFWorkbook}
* @Author : luolin. create at 2015年12月22日 下午5:17:04
*/
public static HSSFWorkbook createTicketReportExcel(String sheetName, String title, String[] headers,
List<List<?>> dataList) {
LOGGER.info("【生成车票销售总量统计表格】sheetName : " + sheetName + " , title : " + title + " , headers : "
+ JSONArray.fromObject(headers));
if (ArrayUtils.isEmpty(headers)) {
LOGGER.warn("【表头为空】");
throw new RuntimeException("表头不能为空");
}
PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
// 1.创建 Workbook
HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
// 2.创建 Sheet
HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
// 3.写入 head
poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
// 4.写入内容
try {
poiExcelUtil.writeComplexContent(hssfWorkbook, hssfSheet, headers, dataList);
} catch (Exception e) {
LOGGER.error("【写入内容部分失败】", e);
throw new RuntimeException("写入内容部分失败");
}
return hssfWorkbook;
}
}
使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法的更多相关文章
- 使用Apache poi来编写导出excel的工具类
在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- 我做了一个 HTML 可视化编辑工具,有前途吗?
疫情在家的这段时间,我做了一个 HTML 可视化编辑工具,做的时候信心满满,差不多完成了,现在反而不如以前信心足了,这玩意有用吗?代码地址: https://github.com/vularsoft/ ...
- Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类
Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...
- 下载数据到Excel,工具类
使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method; import java.math.B ...
- excel读取 工具类
package cn.yongche.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...
- Excel导入工具类兼容xls和xlsx
package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...
- JAVA生成订单编号工具类
JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...
- 使用POI插件,提取导出excel的工具类
在网站的不同的模块都需要使用到导入导出excel的功能,我们就需要写一个通用的工具类ExcelUtil. 我的思路:首先,导入和导出的Excel的文件格式固定:主标题,二级标题,数据行(姑且就这么叫) ...
随机推荐
- PHP和JS判断手机还是电脑访问
当用户使用手机等移动终端访问网站时,我们可以通过程序检测用户终端类型,如果是手机用户,则引导用户访问适配手机屏幕的移动站点.本文将介绍分别使用PHP和JAVASCRIPT代码判断用户终端类型. PHP ...
- Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"问题
今天在程序中,jedis put数据到redis过程中,“MISCONF Redis is configured to save RDB snapshots, but is currently not ...
- 转载:resNet论文笔记
<Deep Residual Learning for Image Recognition>是2016年 kaiming大神CVPR的最佳论文 原文:http://m.blog.csdn. ...
- ssh框架搭建出现的问题和解决
[说明]今天尝试从头开始搭建ssh 框架, 真心是有点不太容易,可能是第一次吧,之前都是小打小闹. 一:今日完成 搭建 Spring 环境 --> 然后搭建 Hibernate 环境 --> ...
- Asp.Net WebApi核心对象解析
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- 把 hhkb 压在mac pro上面用
不知道你们有没有这种感觉, 用惯了外接键盘,然后切换到笔记本自带键盘的时候 手指会有不适应感? 直接 hhkb 放2018款的mac pro上总会压着原来的键盘, 而且我也不想直接禁用掉笔记本自带的键 ...
- Centos7.0安装python2.7后yum报错
yum报错: vi /usr/libexec/urlgrabber-ext-down 把头部的Python改成和/usr/bin/yum中一样的
- Type Java compiler level does not match the version of the installed Java project facet.项目内容没错但是项目上报错,不影响运行
1.Window->Show View->Problems 2.在项目上右键properties->project Facets->修改右侧的version 保持一致 3.w ...
- java获取当前路径&读取当前目录下文件
项目目录如下: test1.class中读取test.txt import java.io.*; import java.util.Scanner; public class Test1 { publ ...
- JPA 对象关系映射之关联关系映射策略
关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...