近期在实施一个项目。当中一项工作是处理历史数据。

客户提供过来的数据是excel表格,超过20万条记录,因为目标系统导入限制,每次仅仅能导入大小不超过8M的文件。所以须要对这些数据进行切割处理。在手工处理一遍后,认为能够通过写一个程序来自己主动实现切割。于是用JAVA写了一个程序,用于针对特定文件实现给定记录数的切割功能。

详见代码:

package cn.sean.main;

import java.io.File;
import java.io.IOException; import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException; public class AccessExcel { Cell[] titleCell;
Cell[][] allCell;
jxl.Workbook workBook;
Sheet sheet; /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub String url = "c:\\a.xls";
AccessExcel ae = new AccessExcel();
ae.readExcel(url);
ae.splitExcel(500, "c:\\"); } /*
* 读取原excel文件,并将相关的数据存储到数组中
*/
public void readExcel(String source) { File file = new File(source);
try { workBook = Workbook.getWorkbook(file);
sheet = workBook.getSheet(0); titleCell = new Cell[sheet.getColumns()];// 用于存储列标题
allCell = new Cell[sheet.getColumns()][sheet.getRows()];// 用于存储全部单元格数据 // 将列标题存储存到一个一维数组中
for (int i = 0; i < titleCell.length; i++) {
titleCell[i] = sheet.getCell(i, 0);
}
// 将全部单元格数据存储到一个二维数组中
for (int i = 0; i < sheet.getColumns(); i++) {
for (int j = 0; j < sheet.getRows(); j++) {
allCell[i][j] = sheet.getCell(i, j); }
} } catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } /*
*@param number代表须要分隔的行数
*@param destination代表分隔文件后存储的路径
*/
public void splitExcel(int number, String destination) { int index = (int) Math.ceil(sheet.getRows() / number);//计算须要分隔多少个文件
File[] files = new File[index + 1];
//初始化文件数组
for (int i = 0; i <= index; i++) {
files[i] = new File(destination + i + ".xls"); }
int n = number;
int y = 1;//用于记录行的位置
for (int i = 0; i <= index; i++) { try {
jxl.write.WritableWorkbook ww = Workbook
.createWorkbook(files[i]);
WritableSheet ws = ww.createSheet("sheet1", 0);
for (int t = 0; t < sheet.getColumns(); t++) {
ws.addCell(new Label(t, 0, allCell[t][0].getContents()));
} out: for (int m = 1; y < sheet.getRows(); y++, m++) { for (int x = 0; x < sheet.getColumns(); x++) { if (y >number) {
number += n;
break out;
} ws.addCell(new Label(x, m, allCell[x][y].getContents())); } }
ww.write();
ww.close(); } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
}

最新文章

  1. Go - 路径、目录名、包名、文件名
  2. [Linux] - Docker pure-ftp使用
  3. redis使用笔记
  4. mysql support chinese
  5. batch insert 1 million datas into mysql
  6. nginx 一般网站部署常用参数设置
  7. jquery事件函数和原生事件绑定函数中return false的区别
  8. Android 多渠道打包原理和使用
  9. POJ3669(Meteor Shower)(bfs求最短路)
  10. php 用户访问菜单页面,必须登录,判断用户是否登录
  11. Qml 写的弹出层控件(13篇博客)
  12. Java NIO内存映射---上G大文件处理(转)
  13. 纯CSS实现tab选项卡切换
  14. python之FTP程序(支持多用户在线)
  15. struts2 type=&quot;redirectAction&quot;重定向 与动态调用方法
  16. Semaphore 源码分析
  17. 丢掉DDL,我用这招3分钟清空 MySQL 9亿记录数据表
  18. flask 第七章 简陋版智能玩具 +MongoDB初识和基本操作
  19. iOS开发之UIGestureRecognizer
  20. Markdown编辑器开发记录(二):Markdown编辑器的使用与开发入门

热门文章

  1. 【08】Vue 之 vue-cli
  2. pat 团体天梯 L3-011. 直捣黄龙
  3. Android Win7 上使用cmd生成Jks
  4. linux中的vi编辑器(二)
  5. poj 3281 Dining 拆点 最大流
  6. CentOS下VNC使用
  7. hdu 4995(离散化下标+模拟)
  8. 洛谷 P2863 [USACO06JAN]牛的舞会The Cow Prom-强连通分量(Tarjan)
  9. BZOJ——3412: [Usaco2009 Dec]Music Notes乐谱
  10. POJ 1239 Increasing Sequences [DP]