Poi模板技术

2023-11-18

Poi模板技术导入导出Excel

在我们的工作中, 也经常会用到Poi模板技术操作Excel文件数据, 而且不同的应用场景对Excel表格的单元格格式和合并操作都需要写大量的代码调试, 比较麻烦. 通过模板技术将自定义格式的Excel文件模板存放在服务器指定位置, 然后读取数据或者填充数据都使用该模板的样式, 不用自己去编写代码设置样式, 使用非常方便. 同样的, 本篇不会写入门案例, 只是记录自己工作或学习中封装的工具方法.

说明: 以下代码基于poi-3.17版本实现, poi-3.17及以上版本相比3.17以下版本样式设置的api改动比较大, 可能存在数据类型获取api过时或报错等, 请参考 Poi版本升级优化

1. 自定义注解

借鉴EasyPoiEasyExcel的使用方式, 都通过注解开发方法来导出指定的字段或读取指定的属性数据. 下面我也自定义了一个简单的注解类.

com.poi.anno.ExcelAttr

package com.poi.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解, 用于标识需要导出到Excel文件的属性字段
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelAttr {
    int sort() default 0;
}

2. 定义数据模型

将导入或导出的数据与pojo实体类关联, 因为要写getter, setter方法, 我使用lombok自动生成.

lombok依赖

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.20</version>
   <optional>true</optional>
</dependency>

com.poi.entity.Employee

package com.poi.entity;

import com.poi.anno.ExcelAttr;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 类描述:数据模型, 员工信息
 * @Author wang_qz
 * @Date 2021/8/14 10:11
 * @Version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Employee {

    @ExcelAttr(sort = 0)
    private int id;
    @ExcelAttr(sort = 1)
    private String name;
    @ExcelAttr(sort = 2)
    private String empno;
    @ExcelAttr(sort = 3)
    private int age;
    @ExcelAttr(sort = 4)
    private String sex;
    @ExcelAttr(sort = 5)
    private String job;
    @ExcelAttr(sort = 6)
    private int departid;
}

3. 大数据模板导入

3.1 导入Excel公共方法

com.poi.util.PoiTemplateUtil#importExcel

public List<T> importExcel(Map<String, Object> params, InputStream inputStream, Class<T> clazz) throws Exception {
	String fileType = (String) params.get("fileType");
	fileType = Objects.equals("xls", fileType) ? fileType : "xlsx";
	Workbook workbook = Objects.equals("xls", fileType) ? new HSSFWorkbook(inputStream) 
      : new XSSFWorkbook(inputStream);
	Sheet sheet = workbook.getSheetAt(0);
	int lastRowNum = sheet.getLastRowNum();
	List<T> dataList = new ArrayList<>();
	for (int i = 1; i <= lastRowNum; i++) {
		Row row = sheet.getRow(i);
		short lastCellNum = row.getLastCellNum();

		// 获取单元格的值并存入objs中
		Object[] objs = new Object[lastCellNum];
		for (int j = 0; j < lastCellNum; j++) {
			Cell cell = row.getCell(j);
			Object value = getCellValue(cell);
			objs[j] = value;
		}

		T t = clazz.newInstance();
		// 反射设置属性值
		Field[] declaredFields = clazz.getDeclaredFields();
		for (int k = 0; k < declaredFields.length; k++) {
			Field field = declaredFields[k];
			field.setAccessible(true);
         // 获取被自定义注解ExcelAttr标识的字段
			ExcelAttr anno = field.getAnnotation(ExcelAttr.class);
			if (anno != null) {
            // 获取设置的字段排序
				int sort = anno.sort();
				if (sort == k) {
					String fieldType = field.getType().getName();
					final Object value = objs[k];
					if (Objects.equals("int", fieldType) || 
                   Objects.equals("Integer", fieldType)) {
						field.setInt(t, Integer.parseInt(value.toString()));
					} else if (Objects.equals("double", fieldType) ||
                          Objects.equals("Double", fieldType)) {
						field.setDouble(t, Double.parseDouble(value.toString()));
					} else {
						field.set(t, value);
					}
				}
			}
		}
		dataList.add(t);
	}
	return dataList;
}

3.2 获取单元格数据类型

com.poi.util.PoiTemplateUtil#getCellValue

/**
 * 获取单元格的不同数据类型的值
 * @param cell
 * @return
 */
public static Object getCellValue(Cell cell) {

	Object cellValue = ""; // 每个单元格的值

	if (cell != null) {
		// 数据类型判断, 获取不同类型的数据
		switch (cell.getCellTypeEnum()) {

			case NUMERIC: // 数字类型
				// 日期格式的数字
				if (HSSFDateUtil.isCellDateFormatted(cell)) {
					// 日期
					cellValue = cell.getDateCellValue();
				} else {
					// 不是日期格式的数字, 返回字符串格式
					cellValue = cell.getRichStringCellValue().toString();
				}
				break;
			case STRING: // 字符串
				cellValue = cell.getStringCellValue();
				break;
			case BOOLEAN: // 布尔
				cellValue = cell.getBooleanCellValue();
				break;
			case FORMULA: // 公式
				cellValue = String.valueOf(cell.getCellFormula());
				break;
			case BLANK: // 空
				cellValue = "";
				break;
			case ERROR: // 错误
				cellValue = "非法字符";
				break;
			default:
				cellValue = "未知类型";
				break;
		}
	}

	return cellValue;
}

4. 大数据模板导出

com.poi.util.PoiTemplateUtil#exportExcel

/**
 * 根据模板填充数据生成excel文件
 * @param params
 * @param outputStream
 * @throws Exception
 */
public void exportExcel(@NonNull Map<String, Object> params, OutputStream outputStream) throws Exception {
	List<T> datas = (List<T>) params.get("datas");
   // "template/excel/template.xls"
	String template = (String) params.get("template"); 
	int templateDataRowIndex = (int) params.get("templateDataRowIndex");
	String fileType = template.substring(template.lastIndexOf(".") + 1);
	fileType = Objects.equals("xls", fileType) ? fileType : "xlsx";
	InputStream templateStream = PoiTemplateUtil.class.getClassLoader()
      .getResourceAsStream(template);
	Workbook workbook = Objects.equals("xls", fileType) ? new 
      HSSFWorkbook(templateStream) : new XSSFWorkbook(templateStream);
	// 获取模板sheet
	Sheet sheet = workbook.getSheetAt(0);
	// 获取模板数据行
	Row templateDataRow = sheet.getRow(templateDataRowIndex);
	// 将模板数据行样式用CellStyle数组存起来,后面填充数据用到该模板数据样式
	CellStyle[] cellStyles = new CellStyle[templateDataRow.getLastCellNum()];
	for (int i = 0; i < cellStyles.length; i++) {
		cellStyles[i] = templateDataRow.getCell(i).getCellStyle();
	}
	// 填充数据
	for (int i = 0; i < datas.size(); i++) {
		// 创建数据行-跟随模板
		Row row = sheet.createRow(i + templateDataRowIndex);
		T t = datas.get(i);
		Field[] declaredFields = t.getClass().getDeclaredFields();
		for (int j = 0; j < cellStyles.length; j++) {
			// 创建单元格
			Cell cell = row.createCell(j);
			// 设置单元格样式
			cell.setCellStyle(cellStyles[j]);
			for (Field field : declaredFields) {
				// 获取被@ExcelAttr注解标注且注解的sort=j的的属性
				field.setAccessible(true);
				ExcelAttr anno = field.getAnnotation(ExcelAttr.class);
				if (anno != null) {
					int sort = anno.sort();
					if (sort == j) {
						// 设置单元格的值
						cell.setCellValue(field.get(t).toString());
					}
				}
			}
		}
	}
	// 生成excel文件到指定位置
	workbook.write(outputStream);
}

5. 导入导出工具类全部代码

com.poi.util.PoiTemplateUtil

package com.poi.util;

import com.poi.anno.ExcelAttr;
import com.poi.entity.Employee;
import lombok.NonNull;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;


/**
 * 类描述:模板导出excel工具类
 * @Author wang_qz
 * @Date 2021/8/14 10:30
 * @Version 1.0
 */
public class PoiTemplateUtil<T> {

    /**
     * 根据模板填充数据生成excel文件
     * @param params
     * @param outputStream
     * @throws Exception
     */
    public void exportExcel(@NonNull Map<String, Object> params, 
                            OutputStream outputStream) throws Exception {
        List<T> datas = (List<T>) params.get("datas");
       // "template/excel/template.xls"
        String template = (String) params.get("template"); 
        int templateDataRowIndex = (int) params.get("templateDataRowIndex");
        String fileType = template.substring(template.lastIndexOf(".") + 1);
        fileType = Objects.equals("xls", fileType) ? fileType : "xlsx";
        InputStream templateStream = PoiTemplateUtil.class.getClassLoader()
           .getResourceAsStream(template);
        Workbook workbook = Objects.equals("xls", fileType) ? 
           new HSSFWorkbook(templateStream) : new XSSFWorkbook(templateStream);
        // 获取模板sheet
        Sheet sheet = workbook.getSheetAt(0);
        // 获取模板数据行
        Row templateDataRow = sheet.getRow(templateDataRowIndex);
        // 将模板数据行样式用CellStyle数组存起来,后面填充数据用到该模板数据样式
        CellStyle[] cellStyles = new CellStyle[templateDataRow.getLastCellNum()];
        for (int i = 0; i < cellStyles.length; i++) {
            cellStyles[i] = templateDataRow.getCell(i).getCellStyle();
        }
        // 填充数据
        for (int i = 0; i < datas.size(); i++) {
            // 创建数据行-跟随模板
            Row row = sheet.createRow(i + templateDataRowIndex);
            T t = datas.get(i);
            Field[] declaredFields = t.getClass().getDeclaredFields();
            for (int j = 0; j < cellStyles.length; j++) {
                // 创建单元格
                Cell cell = row.createCell(j);
                // 设置单元格样式
                cell.setCellStyle(cellStyles[j]);
                for (Field field : declaredFields) {
                    // 获取被@ExcelAttr注解标注且注解的sort=j的的属性
                    field.setAccessible(true);
                    ExcelAttr anno = field.getAnnotation(ExcelAttr.class);
                    if (anno != null) {
                        int sort = anno.sort();
                        if (sort == j) {
                            // 设置单元格的值
                            cell.setCellValue(field.get(t).toString());
                        }
                    }
                }
            }
        }
        // 生成excel文件到指定位置
        workbook.write(outputStream);
    }

    /**
     * 大数据模板导入
     * @param params
     * @param inputStream
     * @param clazz
     * @return
     * @throws Exception
     */
    public List<T> importExcel(Map<String, Object> params, InputStream inputStream,
                               Class<T> clazz) throws Exception {
        String fileType = (String) params.get("fileType");
        fileType = Objects.equals("xls", fileType) ? fileType : "xlsx";
        Workbook workbook = Objects.equals("xls", fileType) ? 
           new HSSFWorkbook(inputStream) : new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        int lastRowNum = sheet.getLastRowNum();
        List<T> dataList = new ArrayList<>();
        for (int i = 1; i <= lastRowNum; i++) {
            Row row = sheet.getRow(i);
            short lastCellNum = row.getLastCellNum();
            // 获取单元格的值并存入objs中
            Object[] objs = new Object[lastCellNum];
            for (int j = 0; j < lastCellNum; j++) {
                Cell cell = row.getCell(j);
                Object value = getCellValue(cell);
                objs[j] = value;
            }

            T t = clazz.newInstance();
            // 反射设置属性值
            Field[] declaredFields = clazz.getDeclaredFields();
            for (int k = 0; k < declaredFields.length; k++) {
                Field field = declaredFields[k];
                field.setAccessible(true);
                // 获取被自定义注解ExcelAttr标识的字段
                ExcelAttr anno = field.getAnnotation(ExcelAttr.class);
                if (anno != null) {
                    // 获取设置的字段排序
                    int sort = anno.sort();
                    if (sort == k) {
                        String fieldType = field.getType().getName();
                        final Object value = objs[k];
                        if (Objects.equals("int", fieldType) || 
                            Objects.equals("Integer", fieldType)) {
                            field.setInt(t, Integer.parseInt(value.toString()));
                        } else if (Objects.equals("double", fieldType) || 
                                   Objects.equals("Double", fieldType)) {
                            field.setDouble(t, 
                                            Double.parseDouble(value.toString()));
                        } else {
                            field.set(t, value);
                        }
                    }
                }
            }
            dataList.add(t);
        }

        return dataList;
    }

    /**
     * 获取单元格的不同数据类型的值
     * @param cell
     * @return
     */
    public static Object getCellValue(Cell cell) {
        Object cellValue = ""; // 每个单元格的值
        if (cell != null) {
            // 数据类型判断, 获取不同类型的数据
            switch (cell.getCellTypeEnum()) {

                case NUMERIC: // 数字类型
                    // 日期格式的数字
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // 日期
                        cellValue = cell.getDateCellValue();
                    } else {
                        // 不是日期格式的数字, 返回字符串格式
                        cellValue = cell.getRichStringCellValue().toString();
                    }
                    break;
                case STRING: // 字符串
                    cellValue = cell.getStringCellValue();
                    break;
                case BOOLEAN: // 布尔
                    cellValue = cell.getBooleanCellValue();
                    break;
                case FORMULA: // 公式
                    cellValue = String.valueOf(cell.getCellFormula());
                    break;
                case BLANK: // 空
                    cellValue = "";
                    break;
                case ERROR: // 错误
                    cellValue = "非法字符";
                    break;
                default:
                    cellValue = "未知类型";
                    break;
            }
        }
        return cellValue;
    }

    /**
     * 造测试数据
     * @return
     */
    public static List<Employee> getDatas() {
        List<Employee> datas = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            Employee employee = Employee.builder()
                    .id(Integer.valueOf(i))
                    .departid(i * 100)
                    .empno("10000" + i)
                    .age(20 + i)
                    .sex(i % 2 == 0 ? "男" : "女")
                    .job(i % 2 == 0 ? "快递员" : "工程师")
                    .name("admin" + i)
                    .build();
            datas.add(employee);
        }
        return datas;

    }
}

6. 数据模板

数据模板就是自己设置好样式的excel文件, 放在项目类路径下, 如下所示:

template/excel/template.xls

image-20210917212806515

7. 单元测试

7.1 测试大数据导入

com.test.poi.PoiTemplateTest#testImportExcel

@Test
public void testImportExcel() throws Exception {
	String filename = "D:\\study\\excel\\employees.xls";
	String fileType = filename.substring(filename.lastIndexOf(".") + 1);
	Map<String, Object> params = new HashMap<>();
	params.put("fileType", fileType);
	PoiTemplateUtil util = new PoiTemplateUtil();
	List<Employee> dataList = util.importExcel(params, new FileInputStream(filename), 
                                              Employee.class);
	dataList.forEach(System.out::println);
}

通过控制台日志查看导入数据效果

image-20210917213255884

7.2 测试大数据导出

com.test.poi.PoiTemplateTest#testExportExcel

@Test
public void testExportExcel() throws Exception {
	Map<String, Object> params = new HashMap<>();
	params.put("template", "template/excel/template.xls");
	params.put("templateDataRowIndex", 1); // 模板中第二行是带格式的数据行
	params.put("datas", getDatas());
	PoiTemplateUtil util = new PoiTemplateUtil();
	util.exportExcel(params, new FileOutputStream("D:\\study\\excel\\employees.xls"));
}

com.test.poi.PoiTemplateTest#getDatas

// 测试数据
public static List<Employee> getDatas() {
	List<Employee> datas = new ArrayList<>();
	for (int i = 1; i <= 10; i++) {
		Employee employee = Employee.builder()
				.id(Integer.valueOf(i))
				.departid(i * 100)
				.empno("10000" + i)
				.age(20 + i)
				.sex(i % 2 == 0 ? "男" : "女")
				.job(i % 2 == 0 ? "快递员" : "工程师")
				.name("admin" + i)
				.build();
		datas.add(employee);
	}
	return datas;
}

导出数据效果

image-20210917213132729

7.3 web端测试

7.3.1 编写controller

com.poi.controller.ExcelController

package com.poi.controller;

import com.constant.CSISCONSTANT;
import com.exception.MyException;
import com.poi.entity.Employee;
import com.poi.service.ExcelReaderImpl;
import com.poi.util.PoiTemplateUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;

/**
 * 类描述:文件上传下载
 * @Author wang_qz
 * @Date 2021/8/14 21:07
 * @Version 1.0
 */
@Controller
@RequestMapping("/excel")
public class ExcelController {

    @RequestMapping("/toExcelPage")
    public String todownloadPage() {
        return "excelPage";
    }

    @RequestMapping("/downloadExcel")
    public void downloadExcel(HttpServletResponse response) throws Exception {
        // 模板文件
        String template = "template/excel/template.xls";
        // 文件类型 xls  xlsx
        String fileType = template.substring(template.lastIndexOf("."));
        // 设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 设置防止中文名乱码
        String filename = URLEncoder.encode("employees信息表", "utf-8");
        // 文件下载方式(附件下载还是在当前浏览器打开)
        response.setHeader("Content-disposition", "attachment;filename=" + filename +
                           fileType);
        // 构建写入到excel文件的数据
        PoiTemplateUtil util = new PoiTemplateUtil();
        Map<String, Object> params = new HashMap<>();
        params.put("template", template);
        params.put("templateDataRowIndex", 1); // 模板中第二行是带格式的数据行
        params.put("datas", util.getDatas());
        util.exportExcel(params, response.getOutputStream());
    }

    @PostMapping("/uploadExcel")
    @ResponseBody
    public String uploadExcel(@RequestParam("file") Part part) throws Exception {
        // 获取上传的文件流
        InputStream inputStream = part.getInputStream();
        // 上传文件名称
        String filename = part.getSubmittedFileName();
        // 读取Excel
        String fileType = filename.substring(filename.lastIndexOf(".") + 1);
        Map<String, Object> params = new HashMap<>();
        params.put("fileType", fileType);
        PoiTemplateUtil util = new PoiTemplateUtil();
        List<Employee> dataList = util.importExcel(params, inputStream,
                                                   Employee.class);
        dataList.forEach(System.out::println);
        return "upload successful!";
    }

    @RequestMapping("/toExcelPage2")
    public String todownloadPage2() {
        return "excelPage2";
    }
}
7.3.1 编写jsp页面

webapp/WEB-INF/jsp/excelPage.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>测试excel文件下载</title>
</head>
<body>
<h3>点击下面链接, 进行excel文件下载</h3>
<a href="<c:url value='/excel/downloadExcel'/>">Excel文件下载</a>
<hr/>
<hr/>
<h3>点击下面按钮, 进行excel文件上传</h3>
<form action="<c:url value='/excel/uploadExcel'/>" method="post" enctype="multipart/form-data">
    <input type="file" name="file"/><br/>
    <input type="submit" value="上传Excel"/>
</form>
</body>
</html>

启动tomcat, 访问http://localhost:8080/excel/toExcelPage, 进入测试页面:

image-20210917214557918

7.3.4 测试效果

下载结果

image-20210917213132729

上传效果

image-20210917213255884

相关推荐

数据分流写入Excel

Poi版本升级优化

StringTemplate实现Excel导出

Poi模板技术

SAX方式实现Excel导入

DOM方式实现Excel导入

Poi实现Excel导出

EasyExcel实现Excel文件导入导出

EasyPoi实现excel文件导入导出

个人博客

欢迎各位访问我的个人博客: https://www.crystalblog.xyz/

备用地址: https://wang-qz.gitee.io/crystal-blog/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Poi模板技术 的相关文章

  • 如何使用 Java 以独立于平台的方式读取 Windows 共享驱动器?

    如何使用 Java 从 Windows 共享驱动器中读取数据 以便执行读取的 Java 代码可以在任何平台上同样正确地运行 您可以使用JCIFS http jcifs samba org 使用纯 Java 代码访问 SMB CIFS 共享
  • JDT - 尝试更改类型的超类。我不知道超级类的限定名称

    我有一个程序 除其他任务外 还必须使用 JDT 更改某些类的超类 我有两个字符串 其中包含要交换的超类的限定名称 例如 org example John 和 org example Smith 并且我正在解析整个 AST 搜索扩展这些类的类
  • JAVA_HOME环境变量和Java JDK趣事

    我想让 Java 在 1 6xxx 上运行 我更改了 JAVA HOME 变量并将其指向目录 C Program Files Java jdk1 6 0 16 我重新启动 PC 我想我可以检查我的机器指向哪个版本的 Java 但它仍然指向旧
  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • 视频文件转换/转码 Google App Engine

    我想启动一个云计算项目 其简单任务是 接收上传的视频文件 对它们进行一些转码 转换 允许用户下载 流式传输生成的文件 我刚在想ffmpeg作为集成在的外部命令行工具Java Google App engine Application 由于很
  • Java JNDI 名称 java:/

    我正在遵循教程 https docs oracle com javase tutorial jndi index html https docs oracle com javase tutorial jndi index html 我的冒险
  • 声纳要求将这一领域定为最终目标

    我的程序中有以下代码 在与 Maven 集成后 我正在运行 SonarQube 5 对其进行代码质量检查 我面临这个错误 将此 public static processStatus 字段设为最终字段 将此 public static pr
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • Java 7 中新的 JNLP 缺少项目警告是怎么回事?

    从 Java 6 切换到 Java 7 后 我的 JNLP 仍然工作正常 但它现在抛出一系列如下错误 Missing Application Name manifest attribute for http blah com app jar
  • Spring Boot - 如何在开发过程中禁用@Cacheable?

    我正在寻找两件事 如何在开发过程中使用 Spring boot dev 配置文件禁用所有缓存 application properties 中似乎没有通用设置可以将其全部关闭 最简单的方法是什么 如何禁用特定方法的缓存 我尝试像这样使用 S
  • oracle.jdbc.driver.OracleDriver ClassNotFoundException

    这是我收到错误的代码 我的classes12 jar已作为外部 jar 导入 import java io IOException import java io PrintWriter import java sql Connection
  • 什么会导致“IO错误java.net.SocketException:选择失败”?

    我的笔记本电脑上运行一个服务器程序 相同的路由器和相同的代码 它工作正常 客户端可以连接 然而 当我将工作区复制到我的电脑并运行它时 我得到了这样的废话 IO错误java net SocketException 选择失败 这是代码 publ
  • 使用 Jboss7 加载资源返回 null

    如何使用Jboss7 1从java代码中加载图像等资源 这曾经与 Jboss4 一起使用 this getClass getClassLoader getResourceAsStream myapp includes images imag
  • 我有什么理由应该嘲笑?

    我也是 Mockito 和 PowerMockito 的新手 我发现我无法使用纯 Mockito 测试静态方法 因此我需要使用 PowerMockito 对吗 我有一个非常简单的类 名为 Validate 使用这个非常简单的方法 publi
  • 如何将 .txt 文件的最后 5 行读入 java

    我有一个包含多个条目的文本文件 例如 hello there my name is JoeBloggs 我如何按降序阅读最后五个条目 即来自 JoeBloggs 那里 我目前有代码只能读取最后一行 public class TestLast
  • jsch - 发送特殊键(CTRL-C、CTRL-D 等)

    我需要向远程终端发送特殊密钥 如何使用 JSCH 做到这一点 Thanks Walter 尝试发送两个字节 0x03 0x04 Check ASCII 表 http www bbdsoft com ascii html了解更多
  • Android 中的自定义相机应用程序问题 - 旋转 270、拉伸捕获视图且未获取所有功能

    我从代码中得到了帮助https github com josnidhin Android Camera Example https github com josnidhin Android Camera Example 但面临一些问题 例如
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • 每次修改代码时都必须 mvn clean install

    我不是来自 Java 世界 但我必须为我的一个项目深入研究它 我不明白为什么每次修改或更新代码时 都必须 mvn clean install 来调试代码的最新版本 你知道为什么吗 尝试按Ctrl Shift F9 热插拔 有时会有所帮助

随机推荐

  • linux中 > 、>> 的用法

    linux中 gt 表示覆盖原文件内容 文件的日期也会自动更新 gt gt 表示追加内容 会另起一行 文件的日期也会自动更新 1 将history命令执行的结果保存到history log文件中 root gxzs solr1 histor
  • app与小程序的区别和优劣势

    在今天的移动互联网时代 APP与小程序已成为人们生活中的不可或缺的一部分 虽然两者都可以在智能手机上运行 但它们之间存在着不同 有些人可能会认为两者并无太大区别 但事实上这两种技术有着各自独特的优劣势 1 区别 APP Applicatio
  • flink学习43:基于行的操作map、flatmap、聚合

    Map FlatMap 聚合
  • 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多 比如Gnome桌面使用GTK 作为默认的图形界面库 KDE桌面使用Qt作为默认的图形界面库 wxWidgets则是另一个使用广泛的图形库 此外使用Java中的Swing AWT组件也可以用于开发Li
  • 没有与参数列表匹配的 重载函数 std::vector<>::erase(remove)

    include
  • 白盒测试用例设计方法学习笔记(二)----基本路径测试法

    转载请注明出处 白盒测试用例设计方法主要分为两种 1 逻辑覆盖法 2 基本路径测试法 本文主要对基本路径测试法的相关进行整理 基本路径测试法 基本路径测试法 是在程序控制流图的基础上通过分析控制构造的环境复杂性导出基本可执行路径的集合 从而
  • Oracle表空间详细介绍

    表空间概述 Oracle的表空间属于Oracle中的存储结构 是一种用于存储数据库对象 如 数据文件 的逻辑空间 是Oracle中信息存储的最大逻辑单元 其下还包含有段 区 数据块等逻辑数据类型 表空间是在数据库中开辟的一个空间 用于存放数
  • 小白入门angular(一)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 操作系统 window 10 IDE webstorm 步骤一 安装nodeJS 链接为https nodejs org en 选择对应的node版本 安装node时会自动
  • Python基础知识第四篇:方法重写+文件处理+异常处理,冒死上传

    Python基础知识第四篇 基础知识第一话 基础知识第二话 基础知识第三话 今天给大家分享的是第四篇 前面几篇我都放在上面了 小伙伴可以自己领取巩固复习 方法重写 Python学习交流Q群 906715085 print 方法重写 codi
  • MATLAB滤波算法和LabVIEW心电图诊断系统

    心电图的生理 我们的目标是构建一个心电图 ECG 它不仅可以自动计算心率 还可以检测其他心脏异常 这需要对 ECG 信号进行更高级的分析 为了实现这一目标 需要完成几个步骤 如下面的流程图所示 在我们详细介绍如何构建 ECG 之前 了解 E
  • Stata学习笔记

    目录 数据的三种类型 在stata中以颜色区分 类型转化 1 destring 红转黑 限于第一种红色 2 tostring 黑转红 3 encode 红转蓝 限于第二种红色 4 label define label value 黑转蓝 5
  • rk3568 nvme硬盘分区,格式化,挂载测试

    前言 环境介绍 1 编译环境 Ubuntu 18 04 5 LTS 2 SDK rk356x linux 3 单板 迅为itop 3568开发板 自制底板 一 查看硬盘 插上硬盘上电 进入系统后通过命令lspci查看nvme硬盘识别情况 r
  • 容灾备份

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 企业运维 网络安全 应用开发 物联网 人工智能 大数据 学习知识 花开堪折直须折 莫待无花空折枝 作者主
  • 使用UE4插件SimpleHTTP的技巧

    UE4插件名 SimpleHTTP 版本 1 1 目录 前置工作 上传资源 下载资源 删除资源 SimpleHTTP源码接口 哈喽大家好 我叫人宅 这节课我们来讲解一下SimpleHTTP使用技巧 该插件目前提供了对web服务器进行上传下载
  • 软件测试的一点心得体会

    在学习软件测试之前 我们先要知道什么是软件测试 只有知道了软件测试是做什么的 我们才能更深入的去理解它 在我的印象里 软件测试就是通过人工或者自动化的方式对软件进行检测 并发现软件的缺陷的一个过程 而软件测试工程师就相当于质检员的角色 在软
  • 深度学习:Keras入门(一)之基础篇

    1 关于Keras 1 简介 Keras是由纯python编写的基于theano tensorflow的深度学习框架 Keras是一个高层神经网络API 支持快速实验 能够把你的idea迅速转换为结果 如果有如下需求 可以优先选择Keras
  • python 指定值的位置_python数组查找某个值的位置

    python如何返回数组中某值在数组的位置 python3里这样 gt gt gt a 1 2 3 gt gt gt b 2 gt gt gt b in a True 先判定b在a里 gt gt gt a index b 1 b在a的位置1
  • RKNPU2通用API和零拷贝API

    RKNPU2通用API 通用API接口按照异构编程规范 需要将数据拷贝到NPU运行时的内存空间 通用API部署流程 初始化上下文 需要先创建上下文对象和读取模型文件 rknn context ctx model load model mod
  • 微信小程序商城--隐私协议--模板参考

    本隐私政策与您所使用的XX 替换成软件名称 服务以及该服务所包括的各种业务功能 以下统称 我们的产品与 或服务 息息相关 希望您在使用我们的产品与 或服务前仔细阅读并确认您已经充分理解本隐私政策所写明的内容 并让您可以按照本隐私政策的指引做
  • Poi模板技术

    Poi模板技术导入导出Excel 在我们的工作中 也经常会用到Poi模板技术操作Excel文件数据 而且不同的应用场景对Excel表格的单元格格式和合并操作都需要写大量的代码调试 比较麻烦 通过模板技术将自定义格式的Excel文件模板存放在