今天遇到一个让她比较苦恼的事情,她手上有一大堆传统Excel格式的课程安排表,现在想将他们全搞成日历格式的,她只能手动一个一个搞,效率很低也很无聊,帮她做了个小工具,通过工具实现格式转换,解放双手!

原来的数据格式是这样:

转完的格式是这样的:

思路:
1.原表格中的数据可以抽象成一个类,类中的属性对应原表格中的列。

package xiaming.chen.domain;/*** Created by xiamingchen on 2017/7/1.*/
public class Info {private String date;private String timeBegin;private String course;private int hours;private String teacher;public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getTimeBegin() {return timeBegin;}public void setTimeBegin(String timeBegin) {this.timeBegin = timeBegin;}public String getCourse() {return course;}public void setCourse(String course) {this.course = course;}public int getHours() {return hours;}public void setHours(int hours) {this.hours = hours;}public String getTeacher() {return teacher;}public void setTeacher(String teacher) {this.teacher = teacher;}@Overridepublic String toString() {return course + "-" + teacher;}
}

2.先将原表格中的数据读取出来,生成一堆的Info对象。
3.初始化新的Excel,将第一列的课表时间安排写入。
4.将日期写入表格,并返回日期总数
5.将每节课的信息填入表内

package xiaming.chen;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import xiaming.chen.domain.Info;
import xiaming.chen.util.TimeFormatUtil;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 为鸭蛋私人订制的Excel转换工具*/
public class ExcelConvertor {private static final String inputFile = "/Users/xiamingchen/Desktop/test.xlsx";private static final String outputFile = "/Users/xiamingchen/Downloads/test/test.xlsx";private static final int rowBeginNum = 4;private static String line1, line2, line3;public static void main(String[] args) throws IOException, InvalidFormatException {List<Info> infoList = parseInfoFromInputFile(inputFile, rowBeginNum);initExcel(outputFile);List<String> dateList = writeDateToExcel(outputFile, infoList);writeTitleToExcel(outputFile, dateList.size());writeInfoToExcel(outputFile, infoList, dateList);}private static void writeTitleToExcel(String destPath, int columnNum) throws IOException {FileInputStream fis = new FileInputStream(destPath);XSSFWorkbook wb = new XSSFWorkbook(fis);XSSFSheet sheet = wb.getSheetAt(0);XSSFRow row1 = sheet.createRow(0);createTitleRow(row1, line1, wb);XSSFRow row2 = sheet.createRow(1);createTitleRow(row2, line2, wb);XSSFRow row3 = sheet.createRow(2);createTitleRow(row3, line3, wb);CellRangeAddress cellRangeAddress1 = new CellRangeAddress(0, 0, 0, columnNum);CellRangeAddress cellRangeAddress2 = new CellRangeAddress(1, 1, 0, columnNum);CellRangeAddress cellRangeAddress3 = new CellRangeAddress(2, 2, 0, columnNum);sheet.addMergedRegion(cellRangeAddress1);sheet.addMergedRegion(cellRangeAddress2);sheet.addMergedRegion(cellRangeAddress3);fis.close();FileOutputStream fos = new FileOutputStream(destPath);wb.write(fos);fos.close();}private static XSSFRow createTitleRow(XSSFRow row, String value, XSSFWorkbook wb) {XSSFCell cell = row.createCell(0);cell.setCellValue(value);XSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.index);cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);return row;}private static void writeInfoToExcel(String destPath, List<Info> infoList, List<String> dateList) throws IOException {FileInputStream fis = new FileInputStream(destPath);XSSFWorkbook wb = new XSSFWorkbook(fis);XSSFSheet sheet = wb.getSheetAt(0);for (int i=0; i<infoList.size(); ++i) {Info info = infoList.get(i);int column = dateList.indexOf(info.getDate()) + 1; //+1是因为第一列不是有效列int rowOfBegin = getIndexOfBeginTime(info.getTimeBegin(), sheet);int rowOfEnd = rowOfBegin + info.getHours() * 2 - 1;XSSFRow row = sheet.getRow(rowOfBegin);XSSFCell cell = row.createCell(column);System.out.println(info.getDate() + " - " + column);cell.setCellValue(info.toString());CellRangeAddress cellRangeAddress = new CellRangeAddress(rowOfBegin, rowOfEnd, column, column);sheet.addMergedRegion(cellRangeAddress);XSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.index);cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);sheet.autoSizeColumn(column, true);}fis.close();FileOutputStream fos = new FileOutputStream(destPath);wb.write(fos);fos.close();}private static List<String> writeDateToExcel(String destPath, List<Info> infoList) throws IOException, InvalidFormatException {List<String> dateList = new ArrayList<String>();FileInputStream fis = new FileInputStream(destPath);XSSFWorkbook wb = new XSSFWorkbook(fis);XSSFSheet sheet = wb.getSheetAt(0);//生成第一行 日期int column = 1;//因为第一(0)行无效,所以从第二(1)行开始for (int i = 0; i < infoList.size(); ++i) {if (dateList.contains(infoList.get(i).getDate())) {continue;}XSSFRow dateRow;if (i == 0) {dateRow = sheet.createRow(3);} else {dateRow = sheet.getRow(3);}XSSFCell dateCell = dateRow.createCell(column);dateCell.setCellValue(infoList.get(i).getDate());column++;dateList.add(infoList.get(i).getDate());}fis.close();FileOutputStream fos = new FileOutputStream(destPath);wb.write(fos);fos.close();return dateList;}private static int getIndexOfBeginTime(String beginTime, XSSFSheet sheet) {int sum = sheet.getLastRowNum();for (int i=rowBeginNum; i<=sum; ++i) {String eachTime = sheet.getRow(i).getCell(0).getStringCellValue();if (beginTime.equals(eachTime)) {return i;}}return -1;}private static void initExcel(String destPath) throws IOException {float start = 8.5F;//每天最早八点半开始float end = 21.0F;//每天最晚21点结束int rowNum = rowBeginNum;//空4行,从第5行开始往下排时间FileOutputStream fos = new FileOutputStream(destPath);XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheet = wb.createSheet();for (float i = start; i <= end; i = i + 0.5F, rowNum++) {XSSFRow row = sheet.createRow(rowNum);XSSFCell time = row.createCell(0);int minute = (int) (i * 10) % 10;String minuteStr = (minute == 5 ? "30" : "00");time.setCellValue((int) i + ":" + minuteStr);}wb.write(fos);fos.close();}private static List<Info> parseInfoFromInputFile(String inputFilePath, int rowBegin) throws IOException {List<Info> infoList = new ArrayList<Info>();FileInputStream fileInput = new FileInputStream(inputFilePath);XSSFWorkbook wb = new XSSFWorkbook(fileInput);XSSFSheet sheet = wb.getSheetAt(0);int lastRowNum = sheet.getLastRowNum(); //内容的最后一行的行数XSSFRow row1 = sheet.getRow(0);line1 = row1.getCell(0).getStringCellValue();XSSFRow row2 = sheet.getRow(1);line2 = row2.getCell(0).getStringCellValue();XSSFRow row3 = sheet.getRow(2);line3 = row3.getCell(0).getStringCellValue();for (int i = rowBegin; i < lastRowNum; ++i) {XSSFRow row = sheet.getRow(i);if (row.getCell(0).getDateCellValue() == null) { //遇到无效行,结束break;}Info info = new Info();Date date = row.getCell(0).getDateCellValue();info.setDate(TimeFormatUtil.formatDate(date));int hours = (int) row.getCell(3).getNumericCellValue();info.setHours(hours);String time = row.getCell(1).getStringCellValue();String[] times = time.split("-");info.setTimeBegin(TimeFormatUtil.formatTime(times[0]));String course = row.getCell(2).getStringCellValue();info.setCourse(course);String teacher = row.getCell(4).getStringCellValue();info.setTeacher(teacher);infoList.add(info);}wb.close();fileInput.close();return infoList;}}

还有一个处理时间和日期的工具类:

package xiaming.chen.util;import java.text.SimpleDateFormat;
import java.util.Date;/*** Created by xiamingchen on 2017/7/1.*/
public class TimeFormatUtil {public static String formatDate(Date date) {SimpleDateFormat format = new SimpleDateFormat("MM/dd");return format.format(date);}public static String formatTime(String time) {int hour = Integer.parseInt(time.split(":")[0]);String minute = time.split(":")[1];if (hour < 8) { //小时数比8小,那就都是下午的hour = hour + 12;}return hour + ":" + minute;}}

使用Java编写Excel传统课表转日历格式相关推荐

  1. java将excel文件转换成txt格式文件

    在实际应用中,我们难免会遇到解析excel文件入库事情,有时候为了方便,需要将excel文件转成txt格式文件.下面代码里面提供对xls.xlsx两种格式的excel文件解析,并写入到一个新的txt文 ...

  2. JAVA设置EXCEL单元格为文本格式

    //新增的四句话,设置CELL格式为文本格式 HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle(); HSSFDataFormat for ...

  3. Java 将Excel文件转成PDF格式

    之前工作需要,查了挺多种Excel转PDF的方法,目前来看这种比较简单,因此分享一下.如果对您有帮助的话请关注下微信号:泽学Java,不定期分享学习心得和成长经验. 首先需要引入aspose-cell ...

  4. java考试座位号_怎么用java编写出座位号(1.0)这样格式?

    展开全部 惨,写了一个多小时. 标题中说"写出座位号(1.0)这样格式",我不是很理解,e68a84e8a2ad3231313335323631343130323136353331 ...

  5. Java的excel去除空行(包括带有格式的空行)

    数据:excel一共1004条数据:包含1行表头+1000有效数据+1个空白行+2行带有格式的空白行 目的:将excel表中的1000条有效数据批量导入(做出限制最多只能批量导入1000行) //获得 ...

  6. java 调excel 的宏_Microsoft Excel宏来运行Java程序

    我学会了在Jxl和POI API的帮助下使用Java程序读写Excel文件. 是否可以在宏的帮助下运行Java程序? 检查一下 - [stackoverflow.com/questions/52973 ...

  7. java csv 日期_java读取excel或者csv时日期格式数据处理

    背景:最近写一个通过excel批量导入数据的功能,里面含有时间,但是java读取之后把时间转为了距离1990年1月1号的天数,比如excel中时间为2018/9/16 18:30,java读取之后变成 ...

  8. java创建excel(不用设置样式,支持xlsx、xls格式, 不支持合并单元格)

    推荐:java 读取excel(支持xlsx.xls格式, 支持合并单元格) java写excel 实现效果 实现思路 基本概念 依赖 对外提供的方法 内部方法 代码实现 测试代码 ExcelWrit ...

  9. JAVA毕业设计web实验室课表管理系统计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计web实验室课表管理系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计web实验室课表管理系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B ...

最新文章

  1. [SCOI2007] 蜥蜴 (最大流)
  2. Java多线程编程那些事:volatile解惑--转
  3. JVM Attach机制实现
  4. android 指针是什么意思,Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(3)...
  5. discuz仿文明争霸游戏官网模版
  6. 在MongoDB中实现聚合函数
  7. Tushare最好用的金融数据接口之一
  8. 解决ubuntu18.04听不到声音(很简单,不用每次开机都调)
  9. linux bam文件格式,pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)...
  10. 免费的兑换码Java
  11. BufferedStream
  12. ftp下载命令行工具wget
  13. 技术人文丨他们“说”的每一句话,都有ASR、NLP、TTS技术
  14. C语言之负数的左移/右移运算
  15. windows上datax的使用记录
  16. javascript 获得上个月、获取下个月日期
  17. 联想小新设置指纹登录
  18. 节拍制作鼓机采样器 XLN Audio XO 1.1.3.3 WiN
  19. Oracle 19C优化器中自动使用了filter操作
  20. Java 读取数据写入word文档并导出

热门文章

  1. python turtle画彩虹简单_python绘制彩虹图
  2. 自媒体6字箴言:广撒网,多捞鱼
  3. 计算机中打印机的类型,什么是打印机 打印机有哪些分类【详细介绍】
  4. Java集合专题3——HashMap和HashTable
  5. c#中CAD文件读取介绍
  6. 使用Eclipse UML 插件 Papyrus由Java代码反向生成类图
  7. RxJava基础知识
  8. 纯 python 开发批量读取照片 Exif 信息的小程序
  9. 模拟退火(Simulated Annealing)——C语言实现
  10. 单点登录与权限管理本质:权限管理介绍