开发小笔记(持续更新)
集合操作(排序、分组、分页)
点击查看
stream分组:
groupingBy(Function)
、groupingBy(Function,Collector)
、groupingBy(Function,Supplier,Collector)
一个参数:一个分组器,使用提供的字段对集合元素进行分组,返回一个
Map<字段,相同字段值的元素集>
Map<String, List<Employee>> map = emps.stream().collect(Collectors.groupingBy(Employee::getCity));
两个参数:一个是分组器,按提供的字段进行分组。一个收集器,下面举例了3种用途
// 先按city分组,再对组里面的成员,统计总销售额
Map<String, Integer> map = emps.stream()
.collect(Collectors.groupingBy(Employee::getCity, Collectors.summingInt(Employee::getSales)));
// 先按城市分组,再对每个组里面的员工姓名放入Set,得到每个城市的姓氏集
Map<String, Set<String>> map = emps.stream()
.collect(Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));
// 先按城市分组,在求分组里面销售额最大的员工
Map<String, Employee> map = emps.stream()
.collect(Collectors.groupingBy(Employee::getCity,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Employee::getSales)), Optional::get)));三个参数:一个分组器,一个最终类型的生产者,一个收集器
// 要求:要计算每个城市中人的姓氏集,并对城市名称进行排序
TreeMap<String, Set<String>> map = emps.stream()
.collect(Collectors.groupingBy(Employee::getCity, TreeMap::new, Collectors.mapping(Employee::getName, Collectors.toSet())));
stream排序:需要倒叙的话后面调用
reversed()
方法降序
list.stream().sorted(Comparator.comparing(实体::get属性).reversed()).collect(Collectors.toList());
只对属性进行排序(此属性是封装类)该属性有为 null 的情况会报错,此时需要 在Comparator.comparing()入参多加一个nullsLast()的方法
单个排序
personnelList.stream()
.sorted(Comparator.comparing(Personnel::getId, Comparator.nullsLast(Integer::compareTo)))
.collect(Collectors.toList());多个排序
personnels.stream().sorted(Comparator.comparing(Personnel::getName, Comparator.nullsLast(String::compareTo))
.thenComparing(Personnel::getEmail,Comparator.nullsLast(String::compareTo)))
.collect(Collectors.toList());
stream分页
计算总页数
int totalPage = msgList.size()/pageSize + (msgList.size()%pageSize == 0 ? 0:1);
分页
// num:当前页,skipnum:起始数
int skipnum = pageSize * (num - 1);
List list= msgList.stream().skip(skipnum).limit(pageSize).collect(Collectors.toList());
LocalDate(Time)常用用法
点击查看
- 获取每周、月、季、年的第一天和最后一天方法
/** |
- 周第一天最后一天、月第一天最后一天
/** |
- 申明定义
LocalDate formatDate = LocalDate.of(2020, 2, 5); // 自定义 |
- 获取年月日
System.out.println(formatDate.getMonth()); // 结果:FEBRUARY。 获取所在月份(英文) |
- 增减年月日:
plusX()
、minusX()
LocalDate nextDay = formatDate.plusDays(1); |
- 比较先后:
compareTo
、isAfter
、isBefore
LocalDateTime now1 = LocalDateTime.now(); |
- 本周第一天、本月第一天…
LocalDate firstWeekDay = formatDate.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); |
- 计算两个日期的间隔天数
LocalDate start = LocalDate.parse("2019-12-01"); |
- localdatatime相差时间数
LocalDateTime now = LocalDateTime.now(); |
- 时间转string
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
- string转时间
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
- LocalDateTime转TimeStamp
LocalDateTime aa = LocalDateTime.now(); |
- String与TimeStamp
String dd = "2023-01-30 15:00:00"; |
时间操作工具类(直接使用)
点击查看
import java.time.DayOfWeek; |
java连接sqlserve
点击查看
maven依赖
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>1.3.1</version>
</dependency>获取连接,取得结果
import java.sql.*;
/**
* java连接sqlserver
* @param sql 要执行的sql语句
* @return 执行结果对象
*/
public ResultSet getConnection(String sql) {
Connection con = null;
ResultSet rs = null;
try {
Class.forName("net.sourceforge.jtds.jdbc.Driver");
con = DriverManager.getConnection("jdbc:jtds:sqlserver://121.49.0.161:1433;DatabaseName=jpzjk", "sa", "123.com");
Statement st = con.createStatement();
rs = st.executeQuery(sql);// 返回结果
} catch (Exception e) {
e.printStackTrace();
} finally {
if (con != null)
try {
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return rs;
}使用(处理结果)
public void test() throws SQLException {
String sql = "SELECT t2.CARDNO barcode,t2.USERNAME name,t1.CREATETIME time FROM CirculateLog t1 " +
"INNER JOIN Reader t2 ON t1.READERBARCODE=t2.BARCODE " +
"WHERE t1.CONTROLTYPE='J' AND t1.CREATETIME>='" + "2023-05-01 00:00:00" + "' " +
"and t1.CREATETIME<='" + "2023-05-01 23:59:59" + "'";
ResultSet rs = this.getConnection(sql);
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
List<CirculateInfoDto> results = new ArrayList<>();// 结果集
while (rs.next()) {
CirculateInfoDto dto = new CirculateInfoDto();// 封装为自定义对象
dto.setBarcode(rs.getString(1));
dto.setName(rs.getString(2));
dto.setTime(LocalDateTime.parse(rs.getString(3).substring(0, 19), df));
results.add(dto);
}
System.out.println("封装后的接口集合:"+results);
}
java调用第三方接口
点击查看
利用 HttpClientBuilder创建连接对象
post方式
public static String postMethod(String url, JSONObject json){
try {
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(url);
post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
StringEntity s = new StringEntity(json.toString());
s.setContentEncoding("UTF-8");
//发送json数据需要设置contentType
s.setContentType("application/x-www-form-urlencoded");
post.setEntity(s); //设置请求参数
HttpResponse response = httpClient.execute(post);
int statusCode = response.getStatusLine().getStatusCode();
if (HttpStatus.SC_OK == statusCode){
//返回String
String res = EntityUtils.toString(response.getEntity());
System.out.println(res);
return res;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}get方式
public static String getMethod(String url){
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet get = new HttpGet(url);
try{
//这里可以设置请求参数,token等
get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
HttpResponse response = httpClient.execute(get);//执行获取响应
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){//根据状态码处理
//返回字符串
String res = EntityUtils.toString(response.getEntity());
System.out.println(res);
return res;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
计算地图上两坐标点距离
点击查看
计算方法
private static final double EARTH_RADIUS = 6378.137;// 地球半径,单位千米
private static double rad(double d) {
//角度转换成弧度
return d * Math.PI / 180.0;
}
/**
* 计算两个地点的距离
*
* @param lat1 第一个纬度
* @param lng1 第一个经度
* @param lat2 第二个纬度
* @param lng2 第二个经度
* @return 两个经纬度的距离
*/
public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
double radLat1 = rad(lat1);//纬度
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;//两点纬度之差
double b = rad(lng1) - rad(lng2);//经度之差
//计算两点之间距离的公式
double s = 2 * Math.asin(Math.sqrt(
Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
//弧长乘地球半径(半径)
s = s * EARTH_RADIUS;
//精确距离的数值(单位千米)
s = Math.round(s * 10000) / 10000;
return s;
}
演示使用
public static void main(String[] args) {
try {
System.out.println("太原-上海:" + getDistance(37.87, 112.53, 31.22, 121.48));
System.out.println("宁波-上海:" + getDistance(29.86, 121.56, 31.22, 121.48));
} catch (Exception e) {
e.printStackTrace();
}
}
easyexcel导入、导出
点击查看
maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>导入、导出的操作对象
@ExcelProperty()就是用来设置表头的,也可以这样写:@ExcelProperty(value="名称",index=索引),如果不需要某个字段,可以使用@ExcelIgnore注解忽略;此外@ExcelProperty()还有很多配置各种类型的表头,详情可以参考EasyExcel官方文档
public class User implements Serializable {
//@ExcelProperty:配置表头
private String id;
private String yhxm;
private String yhxb;
private String yhzh;
private String yhmm;
private Date csrq;
}
导出
public void exportRecord(SelectCardManageListParam param, HttpServletResponse response) {
try {
//1.设置response的基本数据
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("卡片信息", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//2.查询数据
List<SelectCardManageListDto> data = new ArrayList<>();
if (param.getType() == null && param.getIsSend() == null && param.getStatus() == null && (param.getKeyword() == null || "".equals(param.getKeyword()))) {
data = syncCardData;
} else {
param.setPageSize(99999);
BaseReturnDto<com.example.java.tool.Page<SelectCardManageListDto>> dto = new BaseReturnDto<>();
this.list(param, dto);
data = dto.getData().getList();
}
//4,使用工具导出
EasyExcel.write(response.getOutputStream(), SelectCardManageListDto.class)
.sheet("卡片信息")
.doWrite(data);
} catch (IOException e) {
e.printStackTrace();
}
}
- 导入
|
拦截器
public class BatchJoinListener extends AnalysisEventListener<JoinTempDTO> { |
Linux定时任务
点击查看
关于crontab
使用命令
rpm -qa | grep cron
查看系统是否已经安装有crontab软件,如显示如下图则证明已经安装crontab,若执行命令无返回值则证明尚未安装crontab。安装、启动、开机自启
yum install -y vixie-cron crontabs #安装
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置corn表达式实例
0 */2 * * * /sbin/service httpd restart #意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start #意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop #意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home #每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup #每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; #每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls #意思是每月的1、11、21、31日是的6:30执行一次ls命令每天定时重启java服务
编写sh脚本文件,如:restart-blog.sh
#jdk路径,根据你自己的jdk安装位置修改
export PATH=$PATH:/usr/java/jdk1.8.0_162/bin/
#要执行的jar包路径
cd /home/application/govern/
#要执行的jar包名称
APP_NAME=data-govern-1.0.0.jar
#找到服务的pid
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `
#停止服务
kill -9 $pid
#启动服务
nohup java -jar $APP_NAME --spring.profiles.active=dev --javax.security.auth.useSubjectCredsOnly=false --java.security.krb5.debug=true --server.port=8888 > govern.log 2>&1 &
echo $(date +%F)":restart end *************" >> /opt/shFile/equipment/restartLog #重启完成后打印日志给脚本文件赋予777权限
chmod 777 restart-blog.sh
查看jdk安装路径(前提是需要配置环境变量),得到的路径需要去确认,会变,如下图
echo $JAVA_HOME
也可以使用命令
vi /etc/profile
添加crontab定时规则:50 23 * * * /workspace/restart-blog.sh
crontab -e #按下键盘i进行编辑,q!不保存退出,wq保存退出 |
然后重启crontab
/sbin/service crond restart |
参考文章:https://blog.csdn.net/sun_luming/article/details/120421150
poi操作word文档
点击查看
maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>可能会报错:
UnsupportedFileFormatException
,是因为jar包的原因,可能版本太低(4.0.0),三个版本要一致,我报错的原因是,我在公共模块服务引入的此依赖,但是在我使用模块就用不了,干脆就直接在那使用,就在那个模块引入工具类
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.ooxml.POIXMLDocument;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
import org.springframework.stereotype.Component;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
/**
* @Author:李明光
* @Date:2023-6-14 14:22
*/
public class CommonTool {
public static void main(String[] args) throws IOException {
// String filePath = "C:\\Users\\Administrator\\Desktop\\1.docx";
// String formart = "DOCX";
// Map<String, String> textMap = new HashMap<>();
// textMap.put("${标题}", "隐患整改通知书**");
// textMap.put("${内容}", "统计报告。文档形式 配置项:报告模板、统计周期等设置。报告列表(1月季度隐患报告),可下载。按年月日\n" +
// "\t通报:生成--需要设置模板,不需要设置周期,它是根据统计报告的数据生成的,他的生成周期与统计报告一致。发布--是否自动发布(定时、条件-年月日)、发布范围(具体那些部门)。通报列表--可以发布、下载\n" +
// "\n" +
// "\t自动分派 手动分派");
// textMap.put("${姓名}", "安全管理处");
// textMap.put("${时间}", "2023-06-01");
// textMap.put("${aaa}", "2023-06-0100");
// wordTextSubstitution(filePath, formart, textMap, "隐患整改通知书");
//替换的内容,根据key为关键字指定替换成value的值
HashMap<String, String> textMap = new HashMap<>();
textMap.put("${标题}", "隐患整改通知书**");
textMap.put("${内容}", "统计报告。文档形式 配置项:报告模板、统计周期等设置。报告列表(1月季度隐患报告),可下载。按年月日\n" +
"\t通报:生成--需要设置模板,不需要设置周期,它是根据统计报告的数据生成的,他的生成周期与统计报告一致。发布--是否自动发布(定时、条件-年月日)、发布范围(具体那些部门)。通报列表--可以发布、下载\n" +
"\n" +
"\t自动分派 手动分派");
textMap.put("${姓名}", "安全管理处");
textMap.put("${时间}", "2023-06-01");
textMap.put("${aaa}", "2023-06-0100");
String srcPath = "C:\\Users\\Administrator\\Desktop\\3.docx"; //模板文件的地址
String destPath = "C:\\Users\\Administrator\\Desktop\\2.docx"; //替换后保存的地址
// searchAndReplace(srcPath, destPath, textMap);
List<String> headList = new ArrayList<>();
headList.add("责任单位");
headList.add("单位负责人");
headList.add("统计时间段");
headList.add("完成率");
headList.add("及时率");
List<String[]> bodyList = new ArrayList<>();
String[] arr1 = {"保安部", "张三","2023-06-01——2023-06-07","50%","80%"};
String[] arr2 = {"保安部", "李四","2023-06-01——2023-06-07","50%","80%"};
String[] arr3 = {"保安部", "王五","2023-06-01——2023-06-07","50%","80%"};
bodyList.add(arr1);
bodyList.add(arr2);
bodyList.add(arr3);
wordTextSubstitution(srcPath, "DOCX", textMap,"aaa",headList,bodyList);
}
/**
* 只能替换文档内容
* 可在 ${table} 关键字出替换为生成的表格
*
* @param filePath 替换文件所在路径
* @param formart 替换文件扩展名
* @param map 替换数据集合(关键字-实际值)
* @param newName 新生成的文件名
* @param headList 标题集合
* @param bodyList 每一行每一列的数据集合
*/
public static void wordTextSubstitution(String filePath, String formart, Map<String, String> map, String newName,List<String> headList,List<String[]> bodyList) {
String textPath = "";
File file = new File(filePath);
String fileName = file.getName();
try {
if ("DOCX".equals(formart)) {
if (!"".equals(fileName)) {
textPath = filePath.replaceAll(fileName, newName + "_" + System.currentTimeMillis() + ".docx");
}
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(filePath));
// 替换段落中的指定文字
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
while (itPara.hasNext()) {
XWPFParagraph paragraph = itPara.next();
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
String oneparaString = runs.get(i).getText(runs.get(i).getTextPosition());
if (oneparaString != null) {
if(oneparaString.equals("${table}")){ // 判断该关键字是否为table,是则将数据转为表格插入
oneparaString = oneparaString.replace("${table}","");
runs.get(i).setText(oneparaString, 0);
XmlCursor cursor = paragraph.getCTP().newCursor();
// 在指定游标位置插入表格
XWPFTable table = document.insertNewTbl(cursor);
CTTblPr tablePr = table.getCTTbl().getTblPr();
CTTblWidth width = tablePr.addNewTblW();
width.setW(BigInteger.valueOf(8500));
if(headList==null||headList.isEmpty()||bodyList==null||bodyList.isEmpty()){
continue;
}
insertTable(table,headList,bodyList);
}else { // 不是table关键字则按照文档替换进行
for (Map.Entry<String, String> entry : map.entrySet()) {
oneparaString = oneparaString.replace(entry.getKey(), entry.getValue());
}
runs.get(i).setText(oneparaString, 0);
}
}
}
}
// 创建新文件存放新内容
FileOutputStream outStream = new FileOutputStream(textPath);
document.write(outStream);
outStream.close();
} else if ("DOC".equals(formart)) {
if (!"".equals(fileName)) {
textPath = filePath.replaceAll(fileName, newName + "_" + System.currentTimeMillis() + ".doc");
}
HWPFDocument document = new HWPFDocument(new FileInputStream(filePath));
Range range = document.getRange();
for (Map.Entry<String, String> entry : map.entrySet()) {
range.replaceText(entry.getKey(), entry.getValue());
}
// 创建新文件存放新内容
FileOutputStream outStream = new FileOutputStream(textPath);
document.write(outStream);
outStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 替换string中的预设关键字
*
* @param str 源字符串
* @param map 关键字-要替换的值
* @return
*/
public static String replaceStr(String str, Map<String, String> map) {
for (String key : map.keySet()) {
str = str.replace(key, map.get(key));
}
return str;
}
/**
* 无论替换文档和表格都可以,但没有新增表格能力
* @param srcPath 模板文件的地址
* @param destPath 导出的文件保存地址
* @param map 替换的内容
*/
public static void searchAndReplace(String srcPath, String destPath, Map<String, Object> map) {
try {
// 替换的的关键字存放到Set集合中
Set<String> set = map.keySet();
// 读取模板文档
XWPFDocument document = new XWPFDocument(new FileInputStream(srcPath));
/**
* 替换段落中的指定文字
*/
// 读取文档中的段落,回车符为一个段落。
// 同一个段落里面会被“:”等符号隔开为多个对象
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
while (itPara.hasNext()) {
// 获取文档中当前的段落文字信息
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
List<XWPFRun> run = paragraph.getRuns();
// 遍历段落文字对象
for (int i = 0; i < run.size(); i++) {
// 获取段落对象
if (run.get(i) == null) { //段落为空跳过
continue;
}
String sectionItem = run.get(i).getText(run.get(i).getTextPosition()); //段落内容
// 遍历自定义表单关键字,替换Word文档中的内容
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
// 当前关键字
String key = iterator.next();
// 替换内容
sectionItem = sectionItem.replace(key, String.valueOf(map.get(key)));
}
run.get(i).setText(sectionItem, 0);
}
}
/**
* 替换表格中的指定文字
*/
//获取文档中所有的表格,每个表格是一个元素
Iterator<XWPFTable> itTable = document.getTablesIterator();
while (itTable.hasNext()) {
XWPFTable table = (XWPFTable) itTable.next(); //获取表格内容
int count = table.getNumberOfRows(); //表格的行数
//遍历表格行的对象
for (int i = 0; i < count; i++) {
XWPFTableRow row = table.getRow(i); //表格每行的内容
List<XWPFTableCell> cells = row.getTableCells(); //每个单元格的内容
//遍历表格的每行单元格对象
for (int j = 0; j < cells.size(); j++) {
XWPFTableCell cell = cells.get(j); //获取每个单元格的内容
List<XWPFParagraph> paragraphs = cell.getParagraphs(); //获取单元格里所有的段落
for (XWPFParagraph paragraph : paragraphs) {
//获取段落的内容
List<XWPFRun> run = paragraph.getRuns();
// 遍历段落文字对象
for (int o = 0; o < run.size(); o++) {
// 获取段落对象
if (run.get(o) == null || run.get(o).equals("")) {
continue;
}
String sectionItem = run.get(o).getText(run.get(o).getTextPosition()); //获取段落内容
if (sectionItem == null || sectionItem.equals("")) { //段落为空跳过
continue;
}
//遍历自定义表单关键字,替换Word文档中表格单元格的内容
for (String key : map.keySet()) {
// 替换内容
sectionItem = sectionItem.replace(key, String.valueOf(map.get(key)));
run.get(o).setText(sectionItem, 0);
}
}
}
}
}
}
FileOutputStream outStream = null;
outStream = new FileOutputStream(destPath);
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据数据生成表格,并插入到word中
* @param table 表格对象
* @param headList 标题集合
* @param bodyList 每一行每一列的数据集合
*/
private static void insertTable(XWPFTable table,List<String> headList,List<String[]> bodyList) {
table.setWidthType(TableWidthType.AUTO);
XWPFTableRow row = table.getRow(0);
for (int col = 1; col < headList.size(); col++) {//默认会创建一列,即从第2列开始
// 第一行创建了多少列,后续增加的行自动增加列
row.createCell().getCTTc().addNewTcPr();
}
// 设置头部标题
for(int i=0;i<headList.size();i++){
setText(row.getCell(i),headList.get(i));
}
// 设置每一行内容
for(int i=0;i<bodyList.size();i++){//外层循环为行数,内层循环为列数
row = table.createRow(); // 创建一个新行
String[] cols = bodyList.get(i); // 得到该行的列值数组
for(int j=0;j<cols.length;j++){ // 循环列值挨个插入
setText(row.getCell(j),cols[j]);
}
}
}
/**
* 设置表格中要被替换的字段值
*/
private static void setText(XWPFTableCell cell,String text){
// 设置内容居中
CTTc ctTc = cell.getCTTc();
CTTcPr ctPr = ctTc.addNewTcPr();
ctPr.addNewVAlign().setVal(STVerticalJc.CENTER);
ctTc.getPList().get(0).addNewPPr().addNewJc().setVal(STJc.CENTER);
// 替换值
cell.setText(text);
}
}
idea相关
点击查看
可能缺少.iml
文件,idea无法识别
先打开对应模块的命令终端,生成iml
文件
然后输入命令
mvn idea:module |
导入对应的模块
然后再设置文件夹,点到对应的文件夹,再点击文件类型
mysql相关cc
点击查看
SHOW VARIABLES LIKE 'max_connections'; #查看当前的最大连接数 |
webSocket相关
点击查看
—
maven依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>shenzhanwang</groupId>
<artifactId>Spring-websocket</artifactId>
<version>1.1.0</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
</dependencies>
</project>WebSocketConfig配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
* WebScoket配置处理器
*/
public class WebSocketConfig {
/**
* ServerEndpointExporter 作用
*
* 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
*
* @return
*/
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}webSocket服务类
import org.springframework.stereotype.Component;
import javax.websocket.OnMessage;
import javax.websocket.server.ServerEndpoint;
// 该注解表示,此类为WebSocket的服务类
public class EchoServer {
public String encho(String in){
return "hello world";
}
}yaml端口配置
server.port=8080
前端调用方式
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SseEmitter</title>
</head>
<body>
<div id="message"></div>
</body>
<script>
var limitConnect = 0;
init();
function init() {
// 8080未默认端口,可自行替换
var ws = new WebSocket('ws://localhost:8080/notice/2');
// 获取连接状态
console.log('ws连接状态:' + ws.readyState);
//监听是否连接成功
ws.onopen = function () {
console.log('ws连接状态:' + ws.readyState);
limitConnect = 0;
//连接成功则发送一个数据
ws.send('我们建立连接啦');
}
// 接听服务器发回的信息并处理展示
ws.onmessage = function (data) {
console.log('接收到来自服务器的消息:');
console.log(data);
//完成通信后关闭WebSocket连接
// ws.close();
}
// 监听连接关闭事件
ws.onclose = function () {
// 监听整个过程中websocket的状态
console.log('ws连接状态:' + ws.readyState);
reconnect();
}
// 监听并处理error事件
ws.onerror = function (error) {
console.log(error);
}
}
function reconnect() {
limitConnect ++;
console.log("重连第" + limitConnect + "次");
setTimeout(function(){
init();
},2000);
}
</script>
</html>在线查看是否连接成功:> websocket/ws/wss在线调试测试工具 (jackxiang.com)
测试结果
待续…
将办公软件转为PDF—文件预览
点击查看
aspose-words(用于word、txt转pdf),itextpdf(用于ppt、图片、excel转pdf) |
<dependency> |
|
|
滑块验证码
点击查看
|
|
/** |
@TableName注解的表名动态
点击查看
一个实体类对应对个表,由于数据表数据量过大,所以有时候不得不对表进行横向拆分拆分为多张表
2、实体类
|
|
// 查询 |
SpringBoot整合MongoDB
点击查看
<dependency> |
# spring.data.mongodb.uri=mongodb://用户名:密码@IP:端口/数据库?authSource=admin |
|
|
|
|
SpringBoot整合redis
点击查看
<!-- 集成redis依赖 --> |
spring: |
import com.fasterxml.jackson.annotation.JsonAutoDetect; |
|
Linux定时任务重启jar服务
点击查看
rpm -qa | grep crontab |
如未安装,参考:https://blog.csdn.net/Mou_O/article/details/127049665
2、编写脚本文件
|
crontab -e #输入命令 |
service crond restart |
判断ip是否在指定ip段内
点击查看
/** |
判断指定日期是否为节假日(包含周末)
点击查看
|
/** |
public static void main(String[] args) { |
将网络图片存储在服务器,并返回访问地址
点击查看
/** |
点击查看
持续更新中......