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.mzph.cn/news/874429.shtml

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

相关文章

iphone11 如何打开开发者模式?

嗨&#xff0c;大家好&#xff0c;我是兰若姐姐。 今天有小伙伴在问&#xff0c;怎么打开ios手机的开发者模式&#xff0c;他需要做app自动化测试&#xff0c;他的手机是是iphone11&#xff0c;今天就把iphone11开发者打开的步骤给记录分享下 在电脑上安装 Xcode&#xff1a;开…

Sqlmap中文使用手册 - Techniques模块参数使用

目录 1. Techniques模块的帮助文档2. 各个参数的介绍2.1 --techniqueTECH2.2 --time-secTIMESEC2.3 --union-colsUCOLS2.4 --union-charUCHAR2.5 --union-fromUFROM2.6 --dns-domainDNS2.7 --second-urlSEC2.8 --second-reqSEC 1. Techniques模块的帮助文档 Techniques:These o…

怎样使用 Juicer tools 的 dump 命令将.hic文件转换为交互矩阵matrix计数文件 (Windows)

创作日志&#xff1a; 万恶的生信…一个scHiC数据集没有提供处理好的计数文件&#xff0c;需要从.hic转换。Github一个个好长的文档看了好久才定位到 juicer tools 的dump命令&#xff0c;使用起来比想象中简单。 一、下载Juicer tools 注意&#xff1a;使用Juicer tools的前提…

邮件安全篇:邮件反垃圾系统运作机制简介

1. 什么是邮件反垃圾系统&#xff1f; 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…

Dubbo SPI 之路由器

1. 背景介绍 Dubbo 是一个高性能的 Java RPC 框架&#xff0c;由阿里巴巴开源并广泛应用于分布式系统中。在 Dubbo 的架构中&#xff0c;SPI&#xff08;Service Provider Interface&#xff09;是一个关键组件&#xff0c;允许在运行时动态加载不同的服务实现。SPI 机制提供了…

day6 io线程

获取终端输入的字符

深入探究 Golang 反射:功能与原理及应用

Go 出于通用性的考量&#xff0c;提供了反射这一功能。借助反射功能&#xff0c;我们可以实现通用性更强的函数&#xff0c;传入任意的参数&#xff0c;在函数内通过反射动态调用参数对象的方法并访问它的属性。举例来说&#xff0c;下面的bridge接口为了支持灵活调用任意函数&…

构建自动化的魔法:Gradle Build Init的深度解析

构建自动化的魔法&#xff1a;Gradle Build Init的深度解析 在软件开发过程中&#xff0c;自动化构建是提高效率和保证质量的关键。Gradle&#xff0c;作为一个强大的构建工具&#xff0c;提供了丰富的功能来帮助开发者自动化构建过程。其中&#xff0c;Gradle的构建配置包&am…

python一维表转二维表

一维表转二维表 import pandas as pd # 读取数据 product_df pd.read_csv(rD:\excelFile\practice\物品属性值一维表.csv,encodingutf-8) # print(product_df)# 将一维表转变二维 s pd.Series(list(product_df[属性值]),index[product_df[物品编号],product_df[属性名]]) …

【git】github中的Pull Request是什么

在 Git 中&#xff0c;"pull request"&#xff08;简称 PR&#xff09;是一种在分布式版本控制系统中使用的功能&#xff0c;特别是在使用 GitHub、GitLab、Bitbucket 等基于 Git 的代码托管平台时。Pull Request 允许开发者请求将他们的代码更改合并到另一个分支&am…

GMSSL2.x编译鸿蒙静态库和动态库及使用

一、编译环境准备 1.1 开发工具 DevEco-Studio下载。 1.2 SDK下载 ​ 下载编译第三方库的SDK有两种方式&#xff0c;第一种方式从官方渠道根据电脑系统选择对应的SDK版本&#xff0c;第二种方式通过DevEco-Studio下载SDK。本文只介绍通过DevEco-Studio下载SDK的方式。 安装…

C语言 指针方法 将n个数按输入时顺序的逆序排列

将n个数按输入时顺序的逆序排列,用函数实现。 #include <stdio.h>void reverseArray(int *arr, int n) {int temp;for (int i 0; i < n / 2; i) {temp arr[i];arr[i] arr[n - 1 - i];arr[n - 1 - i] temp;} }int main() {int n;printf("Enter the number of…

centos中zabbix安装、卸载及遇到的问题

目录 Zabbix简介Zabbix5.0和Zabbix7.0的区别监控能力方面模板和 API 方面性能、速度方面 centos7安装Zabbix(5.0)安装zabbix遇到的问题卸载Zabbix Zabbix简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参…

给Docker配置网络代理

代理信息 假设我的代理服务器地址为&#xff1a;192.168.3.3:7890 # Dockerd 代理 # 配置 在执行 docker pull 时&#xff0c;是由守护进程 dockerd 来执行。因此&#xff0c;代理需要配在 dockerd 的环境中。而这个环境&#xff0c;则是受 systemd 所管控&#xff0c;因此…

大数据架构体系演进

传统离线大数据架构 ​ 21世纪初随着互联网时代的到来&#xff0c;数据量暴增&#xff0c;大数据时代到来。Hadoop生态群及衍生技术慢慢走向“舞台”&#xff0c;Hadoop是以HDFS为核心存储&#xff0c;以MapReduce&#xff08;简称MR&#xff09;为基本计算模型的批量数据处理…

MATLAB实验五:MATLAB数据分析

1. 某线路上不同时间对应的电压如下表所示&#xff1a; 1&#xff09;用 3 次多项式拟合(polyfit)该实验曲线&#xff0c;要求绘制 2 原始采样 点&#xff0c;并在 1~8 范围内&#xff0c;使用时间间隔为 0.2 的数据绘制拟合曲线。 建立一个脚本文件&#xff1a;text5_1.m 如下…

黑马JavaWeb企业级开发(知识清单)01——前端介绍,HTML实现标题:排版

文章目录 前言一、认识web前端、HTML、CSS二、VS Code开发工具&#xff08;插件弃用问题&#xff09;三、HTML结构标签介绍1. 标签页标题< title >2. 图片标签< img >1) 常见属性2) src路径书写方式 3. 标题标签< h >4. 水平分页线标签< hr > 四、用Vs…

【大数据专题】Spark题库

1 . 简述什么是Spark &#xff1f; 试题回答参考思路&#xff1a; Spark是大数据的调度&#xff0c;监控和分配引擎。它是一个快速通用的集群计算平台.Spark扩展了流行的MapReduce模型.Spark提供的主要功能之一就是能够在内存中运行计算 &#xff0c;但对于在磁盘上运行的复杂…

ElasticSearch-match_phrase查询

match_phrase GET /my_index/address/_search {query: {match_phrase:"hello world"} } hello world 必须相邻才能被搜索出来&#xff0c;比如下面的句子&#xff1a; 1.Hello World tom, do you know me // 能搜到 2.see the world // 搜不到 3.Hello tom // 搜不…

代码随想录day19 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作 、 450.删除二叉搜索树中的节点

代码随想录day19 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中的插入操作 、 450.删除二叉搜索树中的节点 235. 二叉搜索树的最近公共祖先 不算难&#xff0c;分类讨论即可 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tree…