当前位置: 首页 > news >正文

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();}


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据仓库中的数据治理流程
  • 什么是离线语音识别芯片?与在线语音识别的区别
  • nfs和samba
  • 服务器上使用Docker部署sonarQube,并集成到Jenkins实现自动化。
  • 网站验证:确保网络安全与信任的重要步骤
  • C2W3.Assignment.Language Models: Auto-Complete.Part1
  • 一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议(带私活)
  • 智慧隧道可视化:安全与效率的智能保障
  • SpringMVC实现文件上传
  • stm32 io输入中断
  • 系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读
  • 华为云.云日志服务LTS及其基本使用
  • linux、windows、macos清空本地DNS缓存
  • 基于全阶观测器的三自由度运动系统状态反馈控制simulink建模与仿真
  • 45、PHP 实现滑动窗口的最大值
  • 4. 路由到控制器 - Laravel从零开始教程
  • Angular数据绑定机制
  • JS实现简单的MVC模式开发小游戏
  • MaxCompute访问TableStore(OTS) 数据
  • Mysql5.6主从复制
  • python学习笔记-类对象的信息
  • react-native 安卓真机环境搭建
  • Vue2 SSR 的优化之旅
  • 给第三方使用接口的 URL 签名实现
  • 关于for循环的简单归纳
  • 将 Measurements 和 Units 应用到物理学
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 延迟脚本的方式
  • 【云吞铺子】性能抖动剖析(二)
  • 关于Android全面屏虚拟导航栏的适配总结
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (理论篇)httpmoudle和httphandler一览
  • (生成器)yield与(迭代器)generator
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)EXC_BREAKPOINT僵尸错误
  • ./configure、make、make install 命令
  • .DFS.
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET CF命令行调试器MDbg入门(一)
  • .net core docker部署教程和细节问题
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net 调用海康SDK以及常见的坑解释
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []Telit UC864E 拨号上网
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [20171101]rman to destination.txt