jxl,java操作Excel的运用:小型的课时统计系统
来源:互联网 发布:旱雪 知乎 编辑:程序博客网 时间:2024/06/05 13:25
问题描述:
利用文件IO流 写一个课时统计程序 每天输入当天课时 最后统计出一共上了多少课时 每天的日期及上课班级 还有课时总计 都要记录下来 可以生成一个excl表格文件 注意程序的健壮性,如输入的课时非法 要有相应提示处理
首先是要求操作excel文件,所以就到导入一个jxl包:
直接下载地址(迅雷上新建任务即可):
http://nchc.dl.sourceforge.net/project/jexcelapi/jexcelapi/2.6.6/jexcelapi_2_6_6.zip
解压后将里面的jxl.jar导入:
右键工程,选最下面一个,然后java build path->add external jars->选择刚刚解压包里的jxl.jar
选上导入的jxl.jar包,还有上一篇写的jfree实现折线图的两个包,都会用上
包导入成功以后,就了解一个基本使用:
import java.io.IOException;import java.io.OutputStream;import java.util.Calendar;import java.util.Date;import jxl.Workbook;import jxl.write.Boolean;import jxl.write.DateFormats;import jxl.write.DateTime;import jxl.write.Label;import jxl.write.Number;import jxl.write.WritableCellFormat;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;public class ComplexDataExcelWrite { public void createExcel(OutputStream os) throws WriteException,IOException { //创建工作薄 WritableWorkbook workbook = Workbook.createWorkbook(os); //创建新的一页 WritableSheet sheet = workbook.createSheet("First Sheet", 0); //创建要显示的具体内容 Label formate = new Label(0,0,"数据格式"); sheet.addCell(formate); Label floats = new Label(1,0,"浮点型"); sheet.addCell(floats); Label integers = new Label(2,0,"整型"); sheet.addCell(integers); Label booleans = new Label(3,0,"布尔型"); sheet.addCell(booleans); Label dates = new Label(4,0,"日期格式"); sheet.addCell(dates); Label example = new Label(0,1,"数据示例"); sheet.addCell(example); //浮点数据 Number number = new Number(1,1,3.1415926535); sheet.addCell(number); //整形数据 Number ints = new Number(2,1,15042699); sheet.addCell(ints); Boolean bools = new Boolean(3,1,true); sheet.addCell(bools); //日期型数据 Calendar c = Calendar.getInstance(); Date date = c.getTime(); WritableCellFormat cf1 = new WritableCellFormat(DateFormats.FORMAT1); DateTime dt = new DateTime(4,1,date,cf1); sheet.addCell(dt); //把创建的内容写入到输出流中,并关闭输出流 workbook.write(); workbook.close(); os.close(); }}
因为时间的关系,没有每天输入,我要将之前的数据到excel文件里,就用到基本的使用(创建的Excel在D:/class.xls里):
package com.practice.class_hour;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import jxl.Workbook;import jxl.write.DateFormats;import jxl.write.DateTime;import jxl.write.Label;import jxl.write.WritableCellFormat;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;public class XlsTest { public static void createExcel2(OutputStream os) throws WriteException,IOException, ParseException { //创建工作薄 WritableWorkbook workbook = Workbook.createWorkbook(os); //创建新的一页 WritableSheet sheet = workbook.createSheet("First Sheet", 0); //创建要显示的具体内容 Label formate = new Label(0,0,"时间"); sheet.addCell(formate); Label floats = new Label(1,0,"课时数"); sheet.addCell(floats); Label integers = new Label(2,0,"班级"); sheet.addCell(integers); Label booleans = new Label(3,0,"课时总数"); sheet.addCell(booleans); Label startDate = new Label(4, 0, "初始时间"); sheet.addCell(startDate); Label label = new Label(5, 0, "显示周期"); sheet.addCell(label); jxl.write.Number number = new jxl.write.Number(1,1,5); sheet.addCell(number);// Calendar c=Calendar.getInstance();// Date date1=sdf.parse("2016/10/26");// c.setTime(date1);// Date date=c.getTime();// WritableCellFormat cf1=new WritableCellFormat(DateFormats.FORMAT1);// DateTime dt=new DateTime(0,1,date,cf1);// sheet.addCell(dt); Label a1 = new Label(0,1,"2016.10.29"); sheet.addCell(a1); Label b1 = new Label(2,1,"1612"); sheet.addCell(b1); jxl.write.Number number2 = new jxl.write.Number(1,2,7); sheet.addCell(number2); Label a2 = new Label(0,2,"2016.10.31"); sheet.addCell(a2); Label b2 = new Label(2,2,"1614"); sheet.addCell(b2); jxl.write.Number number3 = new jxl.write.Number(1,3,10); sheet.addCell(number3); Label a3 = new Label(0,3,"2016.11.02"); sheet.addCell(a3); Label b3 = new Label(2,3,"1614"); sheet.addCell(b3); jxl.write.Number number4 = new jxl.write.Number(1,4,15); sheet.addCell(number4); Label a4 = new Label(0,4,"2016.11.03"); sheet.addCell(a4); Label b4 = new Label(2,4,"1612"); sheet.addCell(b4); jxl.write.Number number5 = new jxl.write.Number(1,5,8); sheet.addCell(number5); Label a5 = new Label(0,5,"2016.11.10"); sheet.addCell(a5); Label b5 = new Label(2,5,"1610"); sheet.addCell(b5); jxl.write.Number num = new jxl.write.Number(3, 5, 45); sheet.addCell(num); Label label2 = new Label(4, 5, "2016.10.29"); sheet.addCell(label2); jxl.write.Number num2 = new jxl.write.Number(5, 5, 2); sheet.addCell(num2);// Calendar c = Calendar.getInstance();// Date date = c.getTime();// WritableCellFormat cf1 = new WritableCellFormat(DateFormats.FORMAT1);// DateTime dt = new DateTime(4,1,date,cf1);// sheet.addCell(dt); //把创建的内容写入到输出流中,并关闭输出流 workbook.write(); workbook.close(); os.close(); } public static void main(String args[]){ try { FileOutputStream os=new FileOutputStream(new File("D:/class.xls")); //createExcel(os); createExcel2(os); } catch (WriteException | IOException | ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
然后就生成了如下的表:
利用这个已用的表可以看到想要的效果:
主代码:
package com.practice.class_hour;import java.awt.Color;import java.awt.Font;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Scanner;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.AxisSpace;import org.jfree.chart.labels.ItemLabelAnchor;import org.jfree.chart.labels.ItemLabelPosition;import org.jfree.chart.labels.StandardXYItemLabelGenerator;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYItemRenderer;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.data.time.Year;import org.jfree.ui.RectangleInsets;import org.jfree.ui.TextAnchor;import org.omg.Messaging.SyncScopeHelper;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.WritableWorkbook;import jxl.write.WriteException;public class MainMethod { static List<Long> list = new ArrayList<>();// 用来存入每天时间的毫秒数. static List<Integer> gettime = new ArrayList<>();// 存入每天写讲的课时量 static String str = "2016.10.26";// 设置初始时间为2016/16/26 static SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");// 日期表达格式 static Long time; static int days = 2;// 折线图显示的周期数 static int num = 0;// 从初始时间到目前所过的天数 public static void sum() {// 将时间统一放入list表里,方便之后使用 try { time = sdf.parse(str).getTime(); } catch (Exception e) { // TODO: handle exception } list.add(time);// 将初始时间作为第一个时间存入list中 for (; time < System.currentTimeMillis(); num++) {// 将每天的毫秒数存入list,并将gettime赋初值 time += 24 * 60 * 60 * 1000 * days; list.add(time); gettime.add(0); } } // 创建一个Excel文件 public static void createExcel(WritableSheet sheet, List<ClassHour> slist) throws WriteException, IOException { // 创建要显示的具体内容 int i = 0; for (; i < slist.size(); i++) {// 将slist的内容导入 jxl.write.Number number = new jxl.write.Number(1, i + 1, slist.get(i).getNum()); sheet.addCell(number); Label label = new Label(2, i + 1, slist.get(i).getClassName()); sheet.addCell(label); Label date = new Label(0, i + 1, slist.get(i).getDate()); sheet.addCell(date); } } // 将原有Excel文件里的内容放入到slist中去 public static List<ClassHour> copyFile(File file, List<ClassHour> slist) throws BiffException, IOException { Workbook book = Workbook.getWorkbook(file); // 获得第一个工作表对象 Sheet sheet = book.getSheet(0); // 得到第一列第一行的单元格 int rownum = sheet.getRows();// 得到行数 for (int i = 1; i < rownum; i++)// 循环进行读写 { ClassHour ch = new ClassHour(); Cell cell1 = sheet.getCell(0, i); ch.setDate(cell1.getContents()); cell1 = sheet.getCell(1, i); ch.setNum(Integer.parseInt(cell1.getContents())); cell1 = sheet.getCell(2, i); ch.setClassName(cell1.getContents()); slist.add(ch); } book.close(); return slist; } // 对Excel文件就行读取,将每天对应课时数放入gettime中 public static void check(File file) throws BiffException, IOException, ParseException { // 得到file(Excel)的工作簿 Workbook book = Workbook.getWorkbook(file); // 获得第一个工作表对象 Sheet sheet = book.getSheet(0); int rownum = sheet.getRows();// 得到行数 for (int i = 1; i < rownum; i++) { Cell cell1 = sheet.getCell(0, i); String result = cell1.getContents();// 取出日期 Cell cell2 = sheet.getCell(1, i); String number = cell2.getContents();// 取出课时数 Long ltime = sdf.parse(result).getTime(); { for (int j = 0; j < num; j++) { if (ltime < list.get(j + 1) && ltime >= list.get(j)) { gettime.set(j, gettime.get(j) + Integer.parseInt(number));// 将课时数放入对应的天里 break; } } } } book.close(); } // 得到Excel文件里总的课时数 public static int getNum(File file) throws BiffException, IOException { Workbook book = Workbook.getWorkbook(file); // 获得第一个工作表对象 Sheet sheet = book.getSheet(0); int rownum = sheet.getRows();// 得到行数 int sum = 0; for (int i = 1; i < rownum; i++)// 循环进行读写 { Cell cell1 = sheet.getCell(1, i); String result = cell1.getContents(); sum += Integer.parseInt(result); } book.close(); return sum; } // 得到初始时间str和周期days public static void getDateDays(File file) throws BiffException, IOException { Workbook book = Workbook.getWorkbook(file); // 获得第一个工作表对象 Sheet sheet = book.getSheet(0); int rownum = sheet.getRows();// 得到行数 Cell cell1 = sheet.getCell(4, rownum-1); str = cell1.getContents(); cell1 = sheet.getCell(5, rownum-1); days = Integer.parseInt(cell1.getContents()); book.close(); } // 得到Excel文件里总的行数 public static int getRowNum(File file) throws BiffException, IOException { Workbook book = Workbook.getWorkbook(file); // 获得第一个工作表对象 Sheet sheet = book.getSheet(0); int rownum = sheet.getRows();// 得到行数 return rownum; } // 画折线图 public static void draw() { // 首先构造数据 @SuppressWarnings("deprecation") TimeSeries timeSeries = new TimeSeries("课时量", Year.class); // 时间曲线数据集合 TimeSeriesCollection lineDataset = new TimeSeriesCollection(); // 构造数据集合 for (int i = 0; i < num; i += 1) { timeSeries.add(new Year(i + 1), gettime.get(i)); } lineDataset.addSeries(timeSeries); JFreeChart chart = ChartFactory.createTimeSeriesChart("", "date" + "(Every " + days + " days)", "num", lineDataset, true, true, true); // 增加标题 chart.setTitle(new TextTitle("每" + days + "天讲课课时变化量", new Font("隶书", Font.ITALIC, 20))); chart.setAntiAlias(true); XYPlot plot = (XYPlot) chart.getPlot(); plot.setAxisOffset(new RectangleInsets(10, 10, 10, 10));// 图片区与坐标轴的距离 plot.setOutlinePaint(Color.PINK); plot.setInsets(new RectangleInsets(15, 15, 15, 15));// 坐标轴与最外延的距离 // plot.setOrientation(PlotOrientation.HORIZONTAL);//图形的方向,包括坐标轴。 AxisSpace as = new AxisSpace(); as.setLeft(25); as.setRight(25); plot.setFixedRangeAxisSpace(as); chart.setPadding(new RectangleInsets(5, 5, 5, 5)); chart.setNotify(true); // 设置曲线是否显示数据点 XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) plot .getRenderer(); xylineandshaperenderer.setBaseShapesVisible(true); // 设置曲线显示各数据点的值 XYItemRenderer xyitem = plot.getRenderer(); xyitem.setBaseItemLabelsVisible(true); xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition( ItemLabelAnchor.INSIDE10, TextAnchor.BASELINE_LEFT)); xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator()); xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14)); plot.setRenderer(xyitem); // 显示 ChartFrame frame = new ChartFrame("java", chart); frame.pack(); frame.setVisible(true); } // // 修改设置(周期的选择,显示初始时间的选择) // public static void change() { // try (Scanner cin = new Scanner(System.in)) { // System.out.println("修改周期请输入‘1’,修改初始计算时间请输入‘2’:"); // int a = cin.nextInt(); // if (a == 1) { // System.out.println("请输入需要修改的周期(单位:天):"); // days = cin.nextInt(); // } else { // System.out.println("请输入显示的初始时间(格式:2016.01.01):"); // str = cin.next(); // } // } // } // 主要内容,数据的读取和处理 public static void makeExcel(File file) throws BiffException, IOException, WriteException { Scanner cin = new Scanner(System.in); ClassHour ch = new ClassHour(); int rowNum = 2; int sum = 0; List<ClassHour> slist = new ArrayList<>(); if (file.exists()) {// 如果Excel文件不为空,就将其内容放入slist中 rowNum = getRowNum(file); sum = getNum(file); slist = copyFile(file, slist); } int flag = 1;// 退出输入标志变量 do { loop : { int num = 0; System.out.println("请输入今天已讲课时数和班级名称(换行输出),输入-1时进入设置,输入0时退出:"); try { num = cin.nextInt(); flag = num; if (flag == 0) break; if (flag == -1) { System.out.println("修改周期请输入‘1’,修改初始计算时间请输入‘2’:"); int a = cin.nextInt(); if (a == 1) { System.out.println("请输入需要修改的周期(单位:天):"); days = cin.nextInt(); } else { System.out.println("请输入显示的初始时间(格式:2016.01.01):"); str = cin.next(); } break loop; } String className = cin.next(); if (num < 0 && num != -1) { throw new Exception(); } else if (num > 12) { throw new Exception(); } ch.setNum(num); ch.setClassName(className); ch.setDate(sdf.format(new Date())); slist.add(ch); ch = new ClassHour(); sum += num; } catch (Exception e) {// 输入异常时就行处理 System.out.println("请输入正确的课时数数据!"); String st = cin.nextLine();// 将异常数据吃掉 } } } while (flag != 0); try { file.createNewFile(); FileOutputStream os = new FileOutputStream(file); // 创建工作薄 WritableWorkbook workbook = Workbook.createWorkbook(os); // 创建新的一页 WritableSheet sheet = workbook.createSheet("First Sheet", 0); Label label = new Label(0, 0, "时间"); sheet.addCell(label); Label label2 = new Label(1, 0, "课时数"); sheet.addCell(label2); Label label3 = new Label(2, 0, "班级"); sheet.addCell(label3); Label label4 = new Label(3, 0, "课时总数"); sheet.addCell(label4);// 以上设置第一行文字 Label label5 = new Label(4, 0, "初始时间"); sheet.addCell(label5); Label label6 = new Label(5, 0, "显示周期"); sheet.addCell(label6); jxl.write.Number number = new jxl.write.Number(3, slist.size(), sum); sheet.addCell(number); Label label7 = new Label(4, slist.size(), str); sheet.addCell(label7); jxl.write.Number number2 = new jxl.write.Number(5, slist.size(), days); sheet.addCell(number2); createExcel(sheet, slist); workbook.write(); workbook.close(); os.close(); } catch (WriteException | IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } cin.close(); } // 输出方法 public static void outPut(File file) throws BiffException, IOException, ParseException, WriteException { if (file.exists()) getDateDays(file); makeExcel(file); sum(); check(file); System.out.println("每" + days + "天课时情况:"); for (int i = 0; i < num; i++) { String stime = sdf.format(new Date(list.get(i))); String etime = sdf.format(new Date(list.get(i + 1) - 1)); System.out.println(" 第" + (i + 1) + "周期:" + stime + "到" + etime + "讲了 " + gettime.get(i) + "个课时 "); } draw(); } public static void main(String[] args) throws BiffException, WriteException, IOException, ParseException { File file = new File("D:/class.xls"); outPut(file); } // 之前的处理方法 // public static void main(String[] args) // throws BiffException, IOException, WriteException, ParseException { // Scanner cin = new Scanner(System.in); // ClassHour ch = new ClassHour(); // List<ClassHour> list = new ArrayList<>(); // int flag = 1; // do { // System.out.println("请输入今天已讲课时数和班级名称(中间用空格隔开),输入0时退出:"); // try { // int num = cin.nextInt(); // flag = num; // if (flag == 0) // break; // String className = cin.next(); // ch.setNum(num); // ch.setClassName(className); // list.add(ch); // ch = new ClassHour(); // } catch (Exception e) { // System.out.println("请输入正确的数据!"); // String st = cin.next(); // } // } while (flag != 0); // File file = new File("D:/class.xls"); // File file1 = new File("D:/class1.xls"); // if (!file.exists() && !file1.exists()) { // try { // file.createNewFile(); // FileOutputStream os = new FileOutputStream(file); // // 创建工作薄 // WritableWorkbook workbook = Workbook.createWorkbook(os); // // 创建新的一页 // WritableSheet sheet = workbook.createSheet("First Sheet", 0); // Label label = new Label(0, 0, "时间"); // sheet.addCell(label); // Label label2 = new Label(1, 0, "课时数"); // sheet.addCell(label2); // Label label3 = new Label(2, 0, "班级"); // sheet.addCell(label3); // Label label4 = new Label(3, 0, "课时总数"); // sheet.addCell(label4); // createExcel(sheet, list, 1); // workbook.write(); // workbook.close(); // os.close(); // outPut(file); // draw(); // // System.out.println(getNum(file)); // } catch (WriteException | IOException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // } else { // if (!file.exists()) { // File file2 = file; // file = file1; // file1 = file2; // } // // System.out.println(file+" "+file1); // InputStream instream = new FileInputStream(file); // Workbook readwb = Workbook.getWorkbook(instream); // Sheet sheet = readwb.getSheet(0); // // 得到第一列第一行的单元格 // int columnum = sheet.getRows();// 得到列数 // jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(file1, // readwb); // // 读取第一张工作表 // jxl.write.WritableSheet ws = wwb.getSheet(0); // createExcel(ws, list, columnum); // // // jxl.write.WritableCell wc = ws.getWritableCell(3, 0); // // if (wc.getType() == CellType.EMPTY) { // // wc=new Label(3,0, "20"); // // ws.addCell(wc); // // } // // instream.close(); // wwb.write(); // wwb.close(); // file.delete(); // cin.close(); // // System.out.println(getNum(file1)); // outPut(file1); // draw(); // } // }}
ClassHour类:
public class ClassHour { private int num=0; private String className; private String date; @Override public String toString() { return num+" "+ className+" "+ date; } public ClassHour() { } public ClassHour(int num, String className, String date) { super(); this.num = num; this.className = className; this.date = date; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getDate() { return date; } public void setDate(String date) { this.date = date; }}
最后实现每天每次输入的数据都可以记录下来,,并且绘制折线图看到每天讲课数量的变化量(修改初始日期,和sum方法里的time+=后面的数,可以改变初始日期和折现图的周期)
效果图:
2016/11/14输入的数据,然后Excel文件的内容:
每天纪录下来就会得到更好的效果。
0 0
- jxl,java操作Excel的运用:小型的课时统计系统
- java操作excel的工具jxl
- Java操作excel的综合应用(jxl)
- java操作Excel有两种方式 方式1:jxl操作Excel jxl的API
- java对excel表的操作,jxl的基本操作
- jxl对Excel的操作
- jxl对Excel的操作
- java Jxl 操作Excel
- java操作excel jxl
- java jxl excel操作
- 【Java】JXL 操作 Excel
- java操作excel---jxl
- java操作excel-jxl
- jxl--java操作excel
- java jxl操作Excel
- java Jxl 操作Excel
- 对JXL包的研究(java操作excel)
- java 借助jxl进行excel数据的读写操作
- SQL Server数据库大型应用解决方案总结
- 智慧北京:菜单按钮点击的实现
- C++基础--static静态成员
- 字符串函数和方法
- shell杀死指定进程
- jxl,java操作Excel的运用:小型的课时统计系统
- shell常用命令大全
- 一看就懂的ReactJs入门教程(精华版)
- 第三章:基本概念
- 华为BFD和NQA的简单配置
- 【IT】我是计算机系统大师(二)——密码学安全
- 内存管理——数据存放位置和野指针
- PHP内置函数--数组篇
- 分享我的书签