java转换文本文件到xlsx(自制缓冲区,无需先验文件行数)

【0】README
0.1)本文代码利用了 Apache POI 框架 建立 java 到 xlsx 代码的联系;
0.2)本文自制缓冲区从文本文件中读取数据读取,无需先验文件行数;
0.3)本文通过缓冲区大小创建数组,数组容量自动增加,该raw idea 来自于 tomcat 源码中在容器关联管道增加非基础阀的处理方式,包括Session池容量的增加也是这种处理方式;
0.4)for complete source code, please visit https://github.com/pacosonTang/postgraduate-research/tree/master/DataProcess;

【1】如何自制缓冲区读取数据
step1)先建立一个缓冲大小确定(capacity)的二维数组指针data;
step2)通过循环读取数据,并填充二维数组;
step3)判断二维数组大小是否等于原定的缓冲大小(capacity);
step3.1)若等于:则增大缓冲区大小 为 newcapacity,并建立容量为 newcapacity 的二维数组指针datacopy,将原来的data数组的内容copy或填充到datacopy,并使得data指针的指向等于datacopy的指向;
step3.2)若不等于:继续下一步循环;
step4)循环完毕后,建立容量为 newcapacity 的二维数组指针datacopy,将原来的data数组的内容copy或填充到datacopy,并使得data指针的指向等于datacopy的指向;(bingo)
Attention)
A1)本文的capacity设定为10,你可以设定其他值,视具体情况而定;
A2)本文代码 在某些地方吧 data设置为null, 是为了便于 jvm 回收其内存;
// the core code begins.int capacity=10; // buffer size, of course you can specify other values of capacity. step1		double[][] data = new double[capacity][];int lineNum = 0;while((str=reader.readLine())!=null) { // step2String[] array = str.split(",");double[] temp = new double[array.length-1];for (int i = 0; i < array.length-1; i++) {temp[i] = Double.valueOf(array[i]);}if(lineNum%capacity==0) {  // step3double[][] datacopy = new double[lineNum+capacity][]; // step3.1for (int i = 0; i < data.length; i++) {datacopy[i] = data[i];}data = null;data = datacopy;				} data[lineNum++] = temp;	// step3.2	}double[][] datacopy = new double[lineNum][]; // step4.for (int i = 0; i < datacopy.length; i++) {datacopy[i] = data[i];}data = null;data = datacopy;// the core code ends.<span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>
【2】intro to Apache POI
1)for downloading poi lib , please visit http://poi.apache.org/download.html,but you can also download the libs of mine Apache POI lib.
2)POI 将 xlsx 文件抽象为 Workbook对象,将xlsx文件中每张工作表抽象为 Sheet对象,代码如下:
public class XlsxDataModel
{private Workbook workbook;private Sheet sheet;static XlsxDataModel model;private XlsxDataModel(String sheetName){this.workbook = new XSSFWorkbook();;this.sheet = workbook.createSheet(sheetName);}public static XlsxDataModel getInstance(String sheetName){if(model == null){model = new XlsxDataModel(sheetName);}return model;}public Workbook getWorkbook() {return workbook;}public Sheet getSheet() {return sheet;}
}
3)POI 将每一行抽象为Row对象,将每个单元格抽象为 Cell对象,这样就可以定位到每个单元格了,部分代码如下:
XlsxDataModel model = XlsxDataModel.getInstance(sheetName);
Row row = model.getSheet().createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("");
4)POI还从Sheet对象中抽象出遍历每行的迭代器,代码如下(从xlsx读取数据需要迭代器)
// 获取数据行 迭代器final Iterator<Row> readIterator() {Iterator<Row> itr = null;try {File excel = new File(this.dataPath);FileInputStream fis = new FileInputStream(excel);// 创建工作簿XSSFWorkbook book = new XSSFWorkbook(fis);// 创建工作簿下的第一页纸张XSSFSheet sheet = book.getSheetAt(0);// 纸张的迭代器,用于遍历行itr = sheet.iterator();// Iterating over Excel file in Java} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return itr;}
【3】将【1】中的idea 同 POI 结合起来
0)本文重点讲解写数据(写入到xlsx文件),读数据(从xlsx文件中读数据)只是po出方法而已;
1)目的:从文本文件中读取数据,并转化为xlsx文件格式;
step1)从文本读取数据;
step2)将存储文本数据的二维数组写入到xlsx;
public class DataProcess { // source code for step1 begins.public static void main(String[] args) throws IOException {String basedir = System.getProperty("user.dir") + File.separator;BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(basedir+"iris_data.txt")));String str;// the core code begins.int capacity=10; // buffer size, of course you can specify other values of capacity.		double[][] data = new double[capacity][];int lineNum = 0;while((str=reader.readLine())!=null) {String[] array = str.split(",");double[] temp = new double[array.length-1];for (int i = 0; i < array.length-1; i++) {temp[i] = Double.valueOf(array[i]);}if(lineNum%capacity==0) { double[][] datacopy = new double[lineNum+capacity][];for (int i = 0; i < data.length; i++) {datacopy[i] = data[i];}data = null;data = datacopy;				} data[lineNum++] = temp;			}double[][] datacopy = new double[lineNum][];for (int i = 0; i < datacopy.length; i++) {datacopy[i] = data[i];}data = null;data = datacopy;// source code for step1 ends.DataWrite writer = new DataWrite(basedir+"gmeans_irise1.xlsx");// source code for step2 begins.writer.writeArray(data, "item", data[0].length, "iris"); // source code for step2 ends. highlight line.}
}
/*** @author Rong Tang* @version 1.0* @since 20150911*/
public class DataWrite {private String filepath;private FileOutputStream out;public DataWrite(String filepath) {this.filepath = filepath;}/*** @param data is a double array storing data written into xlsx.* @param colPrefix is a row tag.* @param headColNum is column number.* @param sheetName is the name of sheet.* @throws IOException*/public void writeArray(double[][] data, String colPrefix, int headColNum, String sheetName)throws IOException {XlsxDataModel model = XlsxDataModel.getInstance(sheetName);Row row = model.getSheet().createRow(0);Cell cell = row.createCell(0);cell.setCellValue("");for (int i = 1; i <= headColNum; i++) {cell = row.createCell(i);cell.setCellValue(i);} // build the head line overfor (int i = 0; i < data.length; i++) {row = model.getSheet().createRow(i + 1);cell = row.createCell(0);cell.setCellValue(colPrefix + (i + 1));for (int j = 0; j < data[i].length; j++) {cell = row.createCell(j + 1);cell.setCellValue(data[i][j]);}}// write the cluster result(centroid vector) into xlsx overout = new FileOutputStream(filepath);model.getWorkbook().write(out);out.flush();out.close();System.out.println("write " + filepath + " over");}/*** @param data is a int array storing data written into xlsx.* @param colPrefix is a row tag.* @param headColNum is column number.* @param sheetName is the name of sheet.* @throws IOException*/public void writeArray(int[][] data, String colPrefix, int headColNum, String sheetName)throws IOException {XlsxDataModel model = XlsxDataModel.getInstance(sheetName);Row row = model.getSheet().createRow(0);Cell cell = row.createCell(0);cell.setCellValue("");for (int i = 1; i <= headColNum; i++) {cell = row.createCell(i);cell.setCellValue(i);} // build the head line overfor (int i = 0; i < data.length; i++) {row = model.getSheet().createRow(i + 1);cell = row.createCell(0);cell.setCellValue(colPrefix + (i + 1));for (int j = 0; j < data[i].length; j++) {cell = row.createCell(j + 1);cell.setCellValue(data[i][j]);}}// write the cluster result(centroid vector) into xlsx overout = new FileOutputStream(filepath);model.getWorkbook().write(out);out.flush();out.close();System.out.println("write " + filepath + " over");}
}
2)本文象征性的po 出 读数据方法
/*** @author Rong Tang* @version 1.0* @since 20150911*/
public class DataRead {private String dataPath;public DataRead(String dataPath) {this.dataPath = dataPath;}/*** * @param row_start is a startup row startup index for reading. * @param col_start is a startup column index for reading.* @param array is a double array storing the data read from some xlsx. */public final void readDataToArray(int row_start, int col_start, double[][] array) {Iterator<Row> itr = readIterator(); // 获得遍历行 的迭代器Row row = null; // 行对象int row_index = 0;// 行索引int col_index = 0;// 列索引int row_length = array.length; // 数据行数int col_length = array[0].length; // 数据列数// the first row is ommited for it stores column indexif (itr.hasNext()) {itr.next();}// 定位行指针到 row_startwhile(itr.hasNext()){row_index++;if(row_index == row_start) {row_index = 0;break;}itr.next();}// 定位 over// other rows stores time series datawhile (itr.hasNext() && (row_index<row_length)) {col_index = 0;row = itr.next();Iterator<Cell> cellIterator = row.cellIterator(); // 遍历每行单元格的迭代器Cell cell = null; // the first column is ommited for it stores row indexif(cellIterator.hasNext()) { cellIterator.next();}// 定位列指针到 col_startwhile(cellIterator.hasNext()) {col_index++;if(col_index == col_start) {col_index = 0;break;}cellIterator.next();}// 定位 overwhile (cellIterator.hasNext() && (col_index<col_length)) {cell = cellIterator.next();array[row_index][col_index++] = cell.getNumericCellValue();}// 一行数据读取完毕row_index++;			} // 数据行读取完毕}// read data from xlsx to arraypublic final void readDataToArray(int row_start, int row_end) {Iterator<Row> itr = readIterator(); // 获得遍历行 的迭代器Row row = null; // 行对象int index = 0;// 行索引int row_length = row_end-row_start+1; // 数据行数// the first row is ommited for it stores column indexif (itr.hasNext()) {row = itr.next();}// 定位行指针到 row_startwhile(itr.hasNext()){index++;if(index == row_start) {break;}row = itr.next();}index -= row_start;// other rows stores time series datawhile (itr.hasNext() && (index!=row_length)) {int j = 0;row = itr.next();Iterator<Cell> cellIterator = row.cellIterator(); // 遍历每行单元格的迭代器Cell cell = null; // the first column is ommited for it stores row indexif(cellIterator.hasNext())cell = cellIterator.next();while (cellIterator.hasNext()) {cell = cellIterator.next();ClusterData.items[index][j++] = cell.getNumericCellValue();  }// 一行数据读取完毕index++;			} // 数据行读取完毕}// 获取数据行 迭代器final Iterator<Row> readIterator() {Iterator<Row> itr = null;try {File excel = new File(this.dataPath);FileInputStream fis = new FileInputStream(excel);// 创建工作簿XSSFWorkbook book = new XSSFWorkbook(fis);// 创建工作簿下的第一页纸张XSSFSheet sheet = book.getSheetAt(0);// 纸张的迭代器,用于遍历行itr = sheet.iterator();// Iterating over Excel file in Java} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}return itr;}
}

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

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

相关文章

spring react_使用Spring WebFlux构建React性REST API –第3部分

spring react在上一篇文章的续篇中&#xff0c;我们将看到一个应用程序以公开React性REST API。 在此应用程序中&#xff0c;我们使用了 带有WebFlux的Spring Boot 具有响应式支持的Cassandra的Spring数据 卡桑德拉数据库 下面是应用程序的高级体系结构。 让我们看一下bui…

tomcat(12)org.apache.catalina.core.StandardContext源码剖析

【0】README0&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(12)StandardContext源码剖析” 的基础知识&#xff1b;1&#xff09;Context实例表示一个具体的web 应用程序&#xff0c;其中包含一个或多个Wrapper实例&#xff0c;每个Wra…

jms面试题_最新的20多个JMS面试问答(2020)

jms面试题快速浏览JMS&#xff08;Java消息服务&#xff09;常见问题面试问题和答案。 2020年以来的最新问题已添加到列表中。 1.简介 在本教程中&#xff0c;我们将了解2020年经常问到的JMS面试问题。作为面试的一部分&#xff0c;如果您有6年以上的经验&#xff0c;就有机会…

tomcat(13)Host和Engine容器

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(13)Host和Engine容器” 的基础知识&#xff1b;0.2&#xff09;Host容器&#xff1a;若你想在同一个tomcat部署 上运行多个Context 容器的话&#xff0c;就需要使用 Host 容…

spring react_使用Spring WebFlux构建React性REST API –第2部分

spring react在上一篇文章的续篇中&#xff0c;我们将看到React式流规范及其实现之一&#xff0c;称为Project Reactor 。 React流规范定义了以下接口。 让我们看看这些接口的细节。 发布者→发布者是潜在数量不受限制的序列元素的提供者&#xff0c;可按其订阅者的要求发布它…

tomcat(14)服务器组件和服务组件

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(14)服务器组件和服务组件” 的基础知识&#xff1b;0.2&#xff09;for complete source code ,please visit https://github.com/pacosonTang/HowTomcatWorks/tree/maste…

组合模式的安全模式与透明模式

转载自 树形结构的处理——组合模式&#xff08;四&#xff09; 1 透明组合模式与安全组合模式 通过引入组合模式&#xff0c;Sunny公司设计的杀毒软件具有良好的可扩展性&#xff0c;在增加新的文件类型时&#xff0c;无须修改现有类库代码&#xff0c;只需增加一个新的文件类…

spring react_使用Spring WebFlux构建React性REST API –第1部分

spring react在本文中&#xff0c;我们将看到如何使用Spring WebFlux构建响应式REST API。 在进入React式API之前&#xff0c;让我们看看系统是如何发展的&#xff0c;传统REST实现遇到的问题以及现代API的需求。 如果您查看从旧版系统到下文所述的现代系统的期望&#xff0c;…

tomcat(15)Digester库

【0】README0.1&#xff09;本文部分文字描述转自 “how tomcat works”&#xff0c;旨在学习 “tomcat(15)Digester库” 的基础知识&#xff1b;2&#xff09;problemsolution&#xff1a;2.1&#xff09;problem&#xff1a;如下面的代码&#xff0c;Bootstrap类实例化连接器…

api restful_HATEOAS的RESTful服务。 记录超媒体API

api restful1.简介 希望本教程的前一部分不仅揭示了超媒体和HATEOAS的深远意义&#xff0c;而且使我们确信这些都是RESTful Web服务和API的基本构建模块。 在这一部分中&#xff0c;我们将继续侧重于文档方面&#xff0c;以解决如何预先传递Web服务或API功能的问题。 目录 1.…

模版方法模式

转载自 23种设计模式&#xff08;6&#xff09;&#xff1a;模版方法模式定义&#xff1a;定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类型&#xff1a;行为类模式 类图&#…

java并发编程实践(1)intro

【0】README0.1&#xff09;本文部分文字描述转自“java并发编程实践”&#xff0c;旨在学习“java并发编程实践(1)intro”的相关知识&#xff1b;【3】线程带来的风险【3.1】安全性问题1&#xff09;intro&#xff1a;在没有充足同步的case下&#xff0c;多个线程的操作执行顺…

读入的字节都写入字节数组中_使用Java将文件读入字节数组的7个示例

读入的字节都写入字节数组中嗨&#xff0c;大家好&#xff0c;Java程序员经常在现实世界中遇到编程问题&#xff0c;他们需要将文件中的数据加载到字节数组中&#xff0c;该文件可以是文本文件或二进制文件。 一个示例是将文件的内容转换为String以显示。 不幸的是&#xff0c;…

迭代子模式

转载自 《JAVA与模式》之迭代子模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述迭代子&#xff08;Iterator&#xff09;模式的&#xff1a; 迭代子模式又叫游标(Cursor)模式&#xff0c;是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部…

java并发编程实践(2)线程安全性

【0】README 0.0&#xff09;本文部分文字描述转自&#xff1a;“java并发编程实战”&#xff0c; 旨在学习“java并发编程实践(2)线程安全性” 的相关知识&#xff1b;0.1&#xff09;几个术语&#xff08;terms&#xff09;t1&#xff09;对象的状态&#xff1a;是指存储在状…

自动配置jdk_JDK 15中自动自动发送更好的NullPointerException消息

自动配置jdk我讨论了期待已久的和高度赞赏改进的NullPointerException &#xff08; NPE在帖&#xff09;消息“ 更好的默认NullPointerException异常消息即将到Java&#xff1f; ”和“ JDK 14中更好的NPE消息 ”。 当此JEP 358驱动的功能添加到JDK 14中时 &#xff0c;想要从…

tomat(16)关闭钩子

【0】REAMDE0&#xff09;本文部分文字描述转自&#xff1a;“how tomcat works”&#xff0c;旨在学习“tomat(16)关闭钩子”的相关知识&#xff1b;1&#xff09;problemsolution&#xff1a;1.1&#xff09;problem&#xff1a;在很多实际环境中&#xff0c;当用户关闭应用程…

apache.camel_Apache Camel 3.1 – XML路由的快速加载

apache.camelCamel 3.1中添加的一项功能是能够更快地加载XML路由。 这是我们为使Camel变得更小&#xff0c;更快而进行的总体工作的一部分。 您可能会说ewww XML。 但坦率地说&#xff0c;有很多Camel用户使用XML定义路由来构建应用程序。 在Camel 2.x中&#xff0c;您将不得不…

程序中 设置jvm 参数_高效应用程序的7个JVM参数

程序中 设置jvm 参数在撰写本文时&#xff08;2020年3月&#xff09;&#xff0c;围绕垃圾收集和内存&#xff0c;您可以将600多个参数传递给JVM。 如果您包括其他方面&#xff0c;则JVM参数总数将很容易超过1000个。 &#x1f60a;。 任何人都无法消化和理解太多的论据。 在本…

tomcat(17)启动tomcat

【0】README 1&#xff09;本文部分文字描述转自“how tomcat works”&#xff0c;旨在学习“tomcat(17)启动tomcat”的相关知识&#xff1b;2&#xff09;本文重点关注启动Tomcat时会用到的两个类&#xff0c;分别是Catalina类和 Bootstrap类&#xff1b;&#xff08;干货——…