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方法的更多相关文章

  1. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

  2. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  3. 我做了一个 HTML 可视化编辑工具,有前途吗?

    疫情在家的这段时间,我做了一个 HTML 可视化编辑工具,做的时候信心满满,差不多完成了,现在反而不如以前信心足了,这玩意有用吗?代码地址: https://github.com/vularsoft/ ...

  4. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  5. 下载数据到Excel,工具类

    使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method; import java.math.B ...

  6. excel读取 工具类

    package cn.yongche.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  7. Excel导入工具类兼容xls和xlsx

    package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...

  8. JAVA生成订单编号工具类

    JAVA根据时间戳和随机数方式生成订单编号工具类 OrderUtils.java package com.util; import java.text.DateFormat; import java. ...

  9. 使用POI插件,提取导出excel的工具类

    在网站的不同的模块都需要使用到导入导出excel的功能,我们就需要写一个通用的工具类ExcelUtil. 我的思路:首先,导入和导出的Excel的文件格式固定:主标题,二级标题,数据行(姑且就这么叫) ...

随机推荐

  1. 简单理解Javascript中的call 和 apply

    javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...

  2. 桥梁模式(Bridge)

    桥梁模式属于结构类的设计模式,示意结构图如下:

  3. 【BZOJ5060】魔方国 特判

    [BZOJ5060]魔方国 Description 小奇和魔法猪打开了战狂的遗迹,穿越到了东元20年.东元元年,战狂率领一千万士兵毁灭了一个又一个文明,并建立起了新文明——昌和帝国,招募了八位伟人:大 ...

  4. 搭建SVN和eclipse添加svn插件

    在ubuntu服务器下安装svn服务器端,在window下使用eclipse的svn插件团队开发. 安装SVN服务端 1.在ubuntu上安装svn服务器 sudo apt-get install s ...

  5. simplest_ffmpeg_grabdesktop:屏幕录制。 simplest_ffmpeg_readcamera:读取摄像头

    最简单的基于FFmpeg的AVDevice例子(屏幕录制) - 雷霄骅(leixiaohua1020)的专栏 - CSDN博客 https://blog.csdn.net/leixiaohua1020 ...

  6. 第05章—Swagger2打造在线接口文档

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  7. Java 之 GUI 编程

    GUI (Graphical User Interface, 图形用户接口) CLI (Command line User Interface, 命令行用户接口) Java 为 GUI 提供的对象都存 ...

  8. 解决: ./netapp.bin: error while loading shared libraries: libcaffe.so.1.0.0: cannot open shared object file: No such file or directory 运行时报错(caffe)

    caffe安装好后lib没有配置到/usr/lib或/usr/local/lib中,需手动配置: export LD_LIBRARY_PATH=/path_to_your_caffe/build/li ...

  9. Java保留字和关键字

    Java的关键字:java的关键字对Java的编译器有着特殊的意义,它们表示一种数据类型或者程序的结构相关. Java的保留字:为Java预留的关键字,现在还没用到,但在新Java的版本升级中可能会用 ...

  10. 修改sql server实例、数据库、表、字段的排序规则

    转自:http://blog.51cto.com/jimshu/1095780 概念与详情请参考:字符编码与排序规则:https://www.cnblogs.com/gered/p/9145123.h ...