Apache POI-Excel入门与实战

目录

一、了解Apache POI

1.1 什么是Apache POI

1.2 为什么要使用ApaChe POI

1.3 Apache POI应用场景

1.4 Apache POI 依赖

二、Apache POI-Excel 入门案例

2.1 写入Excel文件

2.2 读取文件

四、Apache POI实战

4.1 创建一个获取天气的API

4.2高德天气请求API与响应结果

4.2 后端访问API获取数据

4.3 通过获取地方名称获取AdCode编码

4.4 使用Apache POI包装数据并将预测结果输出到Excel表格中


一、了解Apache POI

1.1 什么是Apache POI

1.2 为什么要使用ApaChe POI

  1. 兼容性:POI能够与各种版本的Office文档进行交互,无论是在创建新文件还是在读取旧文件时,都提供了良好的兼容性。
  2. 无需Office安装:使用POI可以在没有实际安装Microsoft Office软件的情况下操作Office文档,这对于服务器环境尤其重要。
  3. 灵活性:POI提供了丰富的API,允许开发人员以编程方式对Office文档进行复杂的操作,如添加公式、图表、图片、样式等。
  4. 性能:相比于其他一些解决方案,如使用自动化Office应用程序的方式,POI在处理大量数据时通常具有更好的性能。
  5. 安全性:由于POI不需要运行任何Office应用程序,因此可以避免潜在的安全风险,比如宏病毒或恶意脚本的执行。
  6. 开源:POI是一个开源项目,这意味着它是免费的,并且有一个活跃的社区支持,可以提供帮助和持续的更新。

1.3 Apache POI应用场景
 

1.4 Apache POI 依赖

<dependency>  <groupId>org.apache.poi</groupId>  <artifactId>poi</artifactId>  <version>3.16</version>  
</dependency>  
<dependency>  <groupId>org.apache.poi</groupId>  <artifactId>poi-ooxml</artifactId>  <version>3.16</version>  
</dependency>

二、Apache POI-Excel 入门案例

2.1 写入Excel文件

/**  * ApachePOI 测试类  */  
public class ApachePOITest {  /**  * 读取 Excel 文件  */  public static void write() {  // 在内存中创建一个 Excel 文件  XSSFWorkbook excel = new XSSFWorkbook();  // 创建一个工作表sheet  XSSFSheet sheet = excel.createSheet("info");  //在sheet中添加表头第1行,RowNum是从0开始的  XSSFRow row = sheet.createRow(1);  row.createCell(1).setCellValue("姓名");  row.createCell(2).setCellValue("年龄");  //创建一个新的row  XSSFRow row2 = sheet.createRow(2);  //在row中创建单元格  row2.createCell(1).setCellValue("张三");  row2.createCell(2).setCellValue("20");  //创建一个新的row  sheet.createRow(3).createCell(1).setCellValue("李四");  sheet.getRow(3).createCell(2).setCellValue("30");  //将excel写入到文件中  try {  //通过文件输出流将内存中的excel写入到文件中  FileOutputStream fileOutputStream = new FileOutputStream("E:" + File.separator + "POITest.xlsx");  excel.write(fileOutputStream);  } catch (Exception e) {  e.printStackTrace();  }  }  public static void main(String[] args) {  write();  }  //关闭流excel.close
}

2.2 读取文件

/**  * 读取 Excel 文件  */  
public  static  void read() throws IOException {  //通过文件输入流读取文件  FileInputStream fileInputStream = new FileInputStream("E:" + File.separator + "POITest.xlsx");  XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);  //读取第一个工作表  //XSSFSheet sheet = excel.getSheet("info");  XSSFSheet sheetAt = excel.getSheetAt(0);  //获取最后一行的行号  int lastRowNum = sheetAt.getLastRowNum();  //从第二行开始读取数据  for (int i = 1; i <= lastRowNum; i++) {  //获取当前行  XSSFRow row = sheetAt.getRow(i);  //获取当前行的最后一个单元格的编号  short lastCellNum = row.getLastCellNum();  //遍历所有的单元格,从第二个单元格开始  for (int j = 1; j < lastCellNum; j++) {  System.out.print(row.getCell(j) + "\t");  }  System.out.println();  }  //关闭流  excel.close();  fileInputStream.close();  
}


四、Apache POI实战

1.通过读取Excel方法获取一个城市对应的地址编号

2.通过写入Excel方法将一个城市未来的天气情况写入Excel表格中

4.1 创建一个获取天气的API

这里使用高德地图的天气API

创建应用,获取需要的key


4.2高德天气请求API与响应结果

请求API

由于这里的天气需要用到城市编码表,所以先下载好对应的城市编码表格

下载好后内容如下

 返回的Response

APIFOX工具(也可以用postman) 测试:

API地址:https://restapi.amap.com/v3/weather/weatherInfo?parameters

成功返回了数据说明前面一切操作都是对的。而后端访问则通过HttpClient形式访问


4.2 后端访问API获取数据

引入依赖

<dependency>  <groupId>org.apache.httpcomponents</groupId>  <artifactId>httpclient</artifactId>  <version>4.5.13</version>  
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version>
</dependency>

有了API和城市编码表格,现在我们只需要在用户输入对应的城市或者区域的时候,遍历表格进行读取,如果有对应的区则返回adcode

测试类:

	@Testvoid WeatherTest() throws URISyntaxException, IOException {// TODO:这里的key需要引用自己的String key = "xxxxxxx";String city = "110101";CloseableHttpClient httpClient = HttpClients.createDefault();URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");uriBuilder.addParameter("key", key);uriBuilder.addParameter("city", city);HttpGet httpGet = new HttpGet(uriBuilder.build());try (CloseableHttpResponse response = httpClient.execute(httpGet)) {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200) {HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");System.out.println(result);} else {System.out.println("Failed to retrieve data, status code: " + statusCode);}}httpClient.close();}}


4.3 通过获取地方名称获取AdCode编码

	@Testvoid AdCodeQuery() throws IOException {//		TODO:这里输入下载好的地址对照表String AMapFilePath = "E:\\AMap_adcode_citycode.xlsx";
//		需要查询的地址String address = "北京市";FileInputStream fileInputStream = new FileInputStream(AMapFilePath);XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);XSSFSheet sheetAt = workbook.getSheetAt(0);for (int i=1;i<sheetAt.getLastRowNum();i++){XSSFCell cell = sheetAt.getRow(i).getCell(0);String stringCellValue = cell.getStringCellValue();if (stringCellValue.equals(address)){XSSFCell cell1 = sheetAt.getRow(i).getCell(1);String adcode = cell1.getStringCellValue();System.out.println("查询到地区编号为"+adcode);}}}


4.4 使用Apache POI包装数据并将预测结果输出到Excel表格中

	@Testvoid WeatherTest() throws URISyntaxException, IOException {// TODO:这里的key需要引用自己的String key = "xxxxxxx";String city = "110101";String extensions = "all";CloseableHttpClient httpClient = HttpClients.createDefault();URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");uriBuilder.addParameter("key", key);uriBuilder.addParameter("city", city);uriBuilder.addParameter("extensions",extensions);HttpGet httpGet = new HttpGet(uriBuilder.build());try (CloseableHttpResponse response = httpClient.execute(httpGet)) {int statusCode = response.getStatusLine().getStatusCode();if (statusCode == 200) {HttpEntity entity = response.getEntity();String jsonString = EntityUtils.toString(entity, "UTF-8");//				通过POI写入文件// 将JSON字符串解析为Java对象Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {});// 获取casts列表List<Map<String, Object>> casts = (List<Map<String, Object>>) ((List<Map<String, Object>>) map.get("forecasts")).get(0).get("casts");// 创建Excel工作簿Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Weather Forecasts");// 创建标题行Row headerRow = sheet.createRow(0);CellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 写入标题int cellIndex = 0;String[] columnHeaders = {"date", "week", "dayweather", "nightweather", "daytemp", "nighttemp", "daywind", "nightwind", "daypower", "nightpower", "daytemp_float", "nighttemp_float"};for (String columnHeader : columnHeaders) {Cell cell = headerRow.createCell(cellIndex++);cell.setCellValue(columnHeader);cell.setCellStyle(headerStyle);}// 创建数据行int rowIndex = 1;for (Map<String, Object> cast : casts) {Row row = sheet.createRow(rowIndex++);// 写入数据cellIndex = 0;for (String columnHeader : columnHeaders) {Cell cell = row.createCell(cellIndex++);cell.setCellValue(cast.get(columnHeader).toString());}}// 写入Excel文件try (FileOutputStream fileOut = new FileOutputStream("WeatherForecasts.xlsx")) {workbook.write(fileOut);}// 关闭工作簿workbook.close();} else {System.out.println("Failed to retrieve data, status code: " + statusCode);}}httpClient.close();}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381695.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

volatile,最轻量的同步机制

目录 一、volatile 二、如何使用&#xff1f; 三、volatile关键字能代替synchronized关键字吗&#xff1f; 四、总结&#xff1a; 还是老样子&#xff0c;先来看一段代码&#xff1a; 我们先由我们自己的常规思路分析一下代码&#xff1a;子线程中&#xff0c;一直循环&…

小技巧:如何在已知PDF密码情况下去掉PDF的密码保护

第一步&#xff0c;用Edge打开你的pdf&#xff0c;输入密码进去 第二步&#xff0c;点击打印 第三步&#xff0c;选择导出PDF&#xff0c;选择彩印 第四步&#xff0c;选择导出位置&#xff0c;导出成功后打开发现没有密码限制了&#xff01;

物联网mqtt网关搭建背后的技术原理

前言 物联网是现在比较热门的软件领域&#xff0c;众多物联网厂商都有自己的物联网平台&#xff0c;而物联网平台其中一个核心的模块就是Mqtt网关。这篇文章的目的是手把手教大家写书写一个mqtt网关&#xff0c;后端存储支持Kafka/Pulsar&#xff0c;支持mqtt 连接、断链、发送…

DevExpress中文教程 - 如何在.NET MAUI应用中实现Material Design 3?

DevExpress .NET MAUI多平台应用UI组件库提供了用于Android和iOS移动开发的高性能UI组件&#xff0c;该组件库包括数据网格、图表、调度程序、数据编辑器、CollectionView和选项卡组件等。 获取DevExpress v24.1正式版下载 Material Design是一个由Google开发的跨平台指南系统…

计算机毕业设计hadoop+spark+hive物流大数据分析平台 仓储数据分析 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习 知识图谱 大数据

Hadoop物流可视化系统的开题报告 一、课题名称 Hadoop物流可视化系统设计与实现 二、研究背景与意义 随着信息技术的飞速发展&#xff0c;物流行业产生了海量的数据&#xff0c;这些数据包含了订单信息、运输路线、仓储状态等丰富的信息和价值。然而&#xff0c;传统的数据…

谷粒商城实战笔记-44-前端基础-Vue-整合ElementUI快速开发/设置模板代码

文章目录 一&#xff0c;安装导入ElementUI1&#xff0c;安装 element-ui2&#xff0c;导入 element-ui 二&#xff0c;ElementUI 实战1&#xff0c;将 App.vue 改为 element-ui 中的后台布局2&#xff0c;开发导航栏2.1 开发MyTable组件2.2 注册路由2.3 改造App.vue2.4 新增左…

AV1技术学习:Coding Structure

一、SuperBlock SuperBlock 是AV1编解码器可以处理的最大编码块。SuperBlock 大小可以是128 128 或64 64&#xff0c;由 sequence header 控制。SuperBlock 可以进一步划分为更小的编码块&#xff0c;每个编码块都有自己的预测和变换模式。SuperBlock 编码只依赖于它的上侧和…

【jmeter边界值提取器】

【目的】 从响应头中取token的内容 【方案】 使用后置处理器-边界值提取器 【组件路径】HTTP请求->右键添加->后置处理器->边界提取器 用途&#xff1a;边界提取器(Boundary Extractor)是放在Sample请求之后执行的&#xff0c;用于获取左右边界中间的所有字符&#xf…

Anaconda下安装配置Jupyter

Anaconda下安装配置Jupyter 1、安装 conda activate my_env #激活虚拟环境 pip install jupyter #安装 jupyter notebook --generate-config #生成配置文件提示配置文件的位置&#xff1a; Writing default config to: /root/.jupyter/jupyter_notebook_config.py检查版本&am…

指针!!C语言(第二篇)

目录 一. 数组名的理解 二. 一维数组传参的本质 三. 冒泡排序法 四. 二级指针与指针数组 五. 字符指针变量与数组指针 一. 数组名的理解 在我们对指针有了初步的理解之外&#xff0c;今天我们来掌握一些新的知识就是数组与指针&#xff0c;第一个对数组名的了解&#xff…

基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码

回归分析是科学研究特别是生态学领域科学研究和数据分析十分重要的统计工具&#xff0c;可以回答众多科学问题&#xff0c;如环境因素对物种、种群、群落及生态系统或气候变化的影响&#xff1b;物种属性和系统发育对物种分布&#xff08;多度&#xff09;的影响等。纵观涉及数…

excel批量新建多个同类型的表格

背景引入 比如&#xff0c;一个企业有多个部门&#xff0c;现在需要按照某一个excel表模板收集各个部门的信息&#xff0c;需要创建数十个同类型表格&#xff0c;且标题要包含部门名称。 1.修改模板表格标题 在一个文件夹下面放入需要发放给各个部门的表格&#xff0c;将标题…

初识godot游戏引擎并安装

简介 Godot是一款自由开源、由社区驱动的2D和3D游戏引擎。游戏开发虽复杂&#xff0c;却蕴含一定的通用规律&#xff0c;正是为了简化这些通用化的工作&#xff0c;游戏引擎应运而生。Godot引擎作为一款功能丰富的跨平台游戏引擎&#xff0c;通过统一的界面支持创建2D和3D游戏。…

Dav_笔记10:Using SQL Plan Management之1

SQL计划基准概述 SQL计划管理是一种预防机制&#xff0c;可以记录和评估SQL语句的执行计划。此机制可以构建SQL计划基准&#xff0c;这是一组SQL语句的已接受计划。已接受的计划已被证明表现良好。 SQL计划基准的目的 SQL计划基准的目标是保持相应SQL语句的性能&#xff0c;…

函数的参数

函数的参数 函数的参数可以增加函数的通用性 # 没有函数参数的函数 def num_add():a 1b 2return a bs1 num_add() print(s1) # 局限性&#xff1a;只可以计算两个数字的和&#xff0c;无法实现具有较高的通用性# 没有函数参数的函数 def num_add(a, b):return a bs num…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中&#xff0c;代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能&#xff0c;帮助开发者更好地组织和管理代码。通过合理配置&#xff0c;我们可以清晰地看到各个package之间的…

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…

CrowdStrike更新致850万Windows设备宕机,微软紧急救火!

7月18日&#xff0c;网络安全公司CrowdStrike发布了一次软件更新&#xff0c;导致全球大范围Windows系统宕机。 预估CrowdStrike的更新影响了将近850万台Windows设备&#xff0c;多行业服务因此停滞&#xff0c;全球打工人原地放假&#xff0c;坐等吃瓜&#xff0c;网络上爆梗…

GPT盘新增容量后如何扩容?

场景&#xff1a;一块5T的GPT盘&#xff0c;现有需求再加10T&#xff0c; 在虚拟化平台加10T盘后&#xff0c;机器不重启&#xff0c;执行命令 echo 1 > /sys/block/sdb/device/rescan刷新磁盘容量&#xff0c;可看到容量已刷出。 但执行fdisk /dev/sdb时&#xff0c;发现创…

【Django5】模板引擎

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…