热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java控制excel_java操作excel

1.生成并下载excel文件controllerRequestMapping(valuedownload,methodRequestMethod.GET)publicxxxdo

1. 生成并下载excel文件

controller

@RequestMapping(value = "/download", method = RequestMethod.GET)

public xxx downloadFile(HttpServletResponse response) {

response.setContentType("application/octet-stream");

response.setHeader("content-type", "application/octet-stream");

try {

response.setHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode(fileName, "UTF-8"));// 设置文件名

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

try {

excelService.download(response.getOutputStream());

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

service

public interface ExcelService {

void download(OutputStream outputStream) throws IOException;

}

impl

@Override

public void download(OutputStream outputStream) throws IOException{

//1.创建excel(工作簿)

Workbook wb = new XSSFWorkbook();

//2.创建Sheet

Sheet sheet = wb.createSheet();

//3.创建表头,参数为要创建的行的位置

Row header = sheet.createRow(0);

//4.创建单元格对象,向单元格写数据

Cell cell = null;

List headerList = Lists.newArrayList("姓名","年龄","性别","爱好","生日");

for (int i = 0; i

//行对象.createCell(单元格位置)

cell = header.createCell(i);

//赋值

cell.setCellValue(headerList.get(i));

}

//5.工作簿写进输出流

wb.write(outputStream);

}

2. 解析前端上传的excel

Controller

@RequestMapping(value = "/excel/import", method = RequestMethod.GET)

public xxx uploadExcel(@RequestParam("upload") MultipartFile file) {

excelService.uploadExcel(file);

return xxx.OK;

}

service

public interface ExcelService {

void uploadExcel(MultipartFile multipartFile);

}

impl

public void uploadExcel(MultipartFile multipartFile) {

List dataList = ExcelUtil.loadExcelData(multipartFile);

}

ExcelUtil

public static List loadExcelData(MultipartFile file) throws Exception {

Workbook wb;// 创建Excel2003文件对象

wb = WorkbookFactory.create(file.getInputStream());

//获取第一个页签对象

Sheet sheet = wb.getSheetAt(0);

//获取有内容的总行数

int rowsNumber = sheet.getLastRowNum();

if (rowsNumber >= 0) {

List excelList &#61; new ArrayList<>(rowsNumber);

//遍历页签的每一行

Row firstRow &#61; sheet.getRow(0);

if (rowsNumber &#61;&#61; 0 && firstRow &#61;&#61; null) {

return null;

}

//总列数

int cellsNumber &#61; sheet.getRow(0).getLastCellNum();

for (int i &#61; 0; i <&#61; rowsNumber; i&#43;&#43;) {

Row row &#61; sheet.getRow(i);// 获取行对象

if (row &#61;&#61; null) {// 如果为空&#xff0c;不处理

continue;

}

int num &#61; 0;//记录该行的空格总数

List newList &#61; new ArrayList<>(cellsNumber);

for (int j &#61; 0; j

Cell cell &#61; row.getCell(j);// 获取单元格对象

if (cell !&#61; null) {

String value &#61; getValueByType(cell);

if (StringUtils.isEmpty(value)) {

num &#43;&#61; 1;

}

newList.add(value);

} else {

newList.add("");

num &#43;&#61; 1;

}

}

if (num

excelList.add(newList);

}

}

return excelList;

}

wb.close();

return null;

}

private static String getValueByType(Cell cell) {

//判断是否为null或空串

if (cell&#61;&#61;null || cell.toString().trim().equals("")) {

return "";

}

String cellValue &#61; "";

int cellType&#61;cell.getCellType();

if(cellType&#61;&#61;Cell.CELL_TYPE_FORMULA){ //表达式类型

cellType&#61;evaluator.evaluate(cell).getCellType();

}

switch (cellType) {

case Cell.CELL_TYPE_STRING: //字符串类型

cellValue&#61; cell.getStringCellValue().trim();

cellValue&#61;StringUtils.isEmpty(cellValue) ? "" : cellValue;

break;

case Cell.CELL_TYPE_BOOLEAN: //布尔类型

cellValue &#61; String.valueOf(cell.getBooleanCellValue());

break;

case Cell.CELL_TYPE_NUMERIC: //数值类型

if (HSSFDateUtil.isCellDateFormatted(cell)) { //判断日期类型

cellValue &#61; DateUtil.formatDateByFormat(cell.getDateCellValue(), "yyyy-MM-dd");

} else { //否

cellValue &#61; new DecimalFormat("#.######").format(cell.getNumericCellValue());

}

break;

default: //其它类型&#xff0c;取空串吧

cellValue &#61; "";

break;

}

return cellValue;

}



推荐阅读
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南
    从零起步:使用IntelliJ IDEA搭建Spring Boot应用的详细指南 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 本文深入解析了 Apache 配置文件 `httpd.conf` 和 `.htaccess` 的优化方法,探讨了如何通过合理配置提升服务器性能和安全性。文章详细介绍了这两个文件的关键参数及其作用,并提供了实际应用中的最佳实践,帮助读者更好地理解和运用 Apache 配置。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • 在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转
    本文探讨了在Android平台上利用FFmpeg的Swscale组件实现YUV与RGB格式互转的技术细节。通过详细分析Swscale的工作原理和实际应用,展示了如何在Android环境中高效地进行图像格式转换。此外,还介绍了FFmpeg的全平台编译过程,包括x264和fdk-aac的集成,并在Ubuntu系统中配置Nginx和Nginx-RTMP-Module以支持直播推流服务。这些技术的结合为音视频处理提供了强大的支持。 ... [详细]
  • 深入解析 javax.faces.view.ViewDeclarationLanguageWrapper.getWrapped() 方法及其应用实例 ... [详细]
author-avatar
慧慧2502916487
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有