Java使用POI操作Excel并创建下拉框
java创建excel的常用方法
java创建excel的常用方法
Java中创建Excel文件有多种方法,以下是一些常用的方法:
1. Apache POI库,Apache POI是一个用于读写Microsoft Office文件的开源库,可以使用它来创建和编辑Excel文件。
通过POI库,可以创建工作簿(Workbook)、工作表(Sheet)、单元格(Cell)等对象,然后填充数据并保存为Excel文件。
这是Java中
创建Excel文件最常用的方法之一。
2. JExcelApi库,JExcelApi也是一个用于操作Excel文件的
开源库,它提供了创建、读取和修改Excel文件的功能。
通过JExcelApi,可以创建工作簿、工作表,并向单元格中写入数据,最
后保存为Excel文件。
3. 使用Java的CSV库,虽然CSV文件不是真正的Excel文件,但在某些情况下也可以满足需求。
Java中有一些CSV库可以用来创
建和编辑CSV文件,例如OpenCSV和uniVocity等。
这些库可以将
数据写入CSV格式的文件,然后可以通过Excel等软件打开并保存
为Excel文件。
4. 使用第三方Excel库,除了上述提到的库外,还有一些第三
方的商业库,如Aspose.Cells,可以用来创建和编辑Excel文件。
这些库通常提供了更丰富的功能和更好的性能,但需要购买许可证。
总的来说,以上列举的方法是Java中创建Excel文件的常用方法。
选择合适的方法取决于具体的需求和项目的要求。
希望这些信
息能够帮助到你。
poi教程
poi教程Poi教程概述:Poi是一款Java库,用于处理Microsoft Office格式文件,如Excel、Word和PowerPoint。
它提供了丰富的API,使开发人员能够读取、写入和修改这些文件。
Poi教程内容:1. 安装Poi库:首先,你需要下载并安装Poi库。
你可以从Apache的官方网站上找到最新版本的Poi库。
安装过程包括将Poi库添加到你的Java项目的构建路径中。
2. 创建Excel文档:使用Poi,你可以创建一个新的Excel文档。
你可以定义工作表、行和单元格,并在单元格中添加数据。
你还可以设置单元格的格式,如字体、颜色和边框。
3. 读取Excel文件:Poi可以读取现有的Excel文件。
你可以打开一个文件并读取工作表、行和单元格中的数据。
你还可以根据需要筛选和处理数据。
4. 写入Excel文件:除了读取数据,Poi还可以将数据写入现有的Excel文件。
你可以创建新的工作表、行和单元格,并在其中插入数据。
你可以使用Poi的API来设置单元格的格式和其他属性。
5. 处理Word和PowerPoint文件:除了处理Excel文件,Poi还可以读取和写入Word和PowerPoint文件。
你可以打开Word文档并访问其中的段落、表格和其他元素。
你还可以修改PowerPoint演示文稿中的幻灯片、文本和图像。
6. 添加图表和图像:Poi提供了创建和修改图表的功能。
你可以使用Poi的API创建各种类型的图表,并在其中添加数据。
此外,你还可以在Excel文件中添加图像,并设置其大小、位置和其他属性。
7. 导出数据:一旦你完成了对Excel、Word或PowerPoint文件的处理,你可以使用Poi将其导出为其他格式,如PDF或HTML。
这使得你可以轻松地共享和打印处理过的文件。
8. 错误处理和异常处理:在使用Poi时,可能会遇到各种错误和异常。
你需要学会如何正确处理这些错误,以确保你的代码能够顺利运行。
java的POI操作Excel文件
java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。
1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。
Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。
解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。
如果sheet是由POI生成的则没有这个问题。
我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。
2、如何拷贝行我在的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写://注:this.fWorkbook是一个HSSHWorkbook,请自行在外部newpublic void copyRows(String pSourceSheetName,String pTargetSheetName,int pStartRow, int pEndRow,int pPosition){HSSFRow sourceRow = null;HSSFRow targetRow = null;HSSFCell sourceCell = null;HSSFCell targetCell = null;HSSFSheet sourceSheet = null;HSSFSheet targetSheet = null;Region region = null;int cType;int i;short j;int targetRowFrom;int targetRowTo;if ((pStartRow == -1) || (pEndRow == -1)){return;}sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);targetSheet = this.fWorkbook.getSheet(pTargetSheetName);//拷贝合并的单元格for (i = 0; i < sourceSheet.getNumMergedRegions(); i++){region = sourceSheet.getMergedRegionAt(i);if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow)) {targetRowFrom = region.getRowFrom() - pStartRow + pPosition; targetRowTo = region.getRowTo() - pStartRow + pPosition;region.setRowFrom(targetRowFrom);region.setRowTo(targetRowTo);targetSheet.addMergedRegion(region);}}//设置列宽for (i = pStartRow; i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow != null){for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) {targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));}break;}}//拷贝行并填充数据for (;i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow == null){continue;}targetRow = targetSheet.createRow(i - pStartRow + pPosition);targetRow.setHeight(sourceRow.getHeight());for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)sourceCell = sourceRow.getCell(j);if (sourceCell == null){continue;}targetCell = targetRow.createCell(j);targetCell.setEncoding(sourceCell.getEncoding());targetCell.setCellStyle(sourceCell.getCellStyle());cType = sourceCell.getCellType();targetCell.setCellType(cType);switch (cType){case HSSFCell.CELL_TYPE_BOOLEAN:targetCell.setCellValue(sourceCell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_ERROR:targetCell.setCellErrorV alue(sourceCell.getErrorCellValue());break;case HSSFCell.CELL_TYPE_FORMULA://parseFormula这个函数的用途在后面说明targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));break;case HSSFCell.CELL_TYPE_NUMERIC:targetCell.setCellValue(sourceCell.getNumericCellV alue());break;case HSSFCell.CELL_TYPE_STRING:targetCell.setCellValue(sourceCell.getStringCellValue());break;}}}}这个函数有两个问题暂时无法解决:a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!3、公式的问题POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiV olatile))和today(ATTR(semiV olatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:private String parseFormula(String pPOIFormula){final String cstReplaceString = "ATTR(semiV olatile)"; //$NON-NLS-1$StringBuffer result = null;int index;result = new StringBuffer();index = pPOIFormula.indexOf(cstReplaceString);if (index >= 0){result.append(pPOIFormula.substring(0, index));result.append(pPOIFormula.substring(index + cstReplaceString.length()));}else{result.append(pPOIFormula);}return result.toString();}至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向Excel写入图片的问题。
javapoi导出excel设置下拉选择框
javapoi导出excel设置下拉选择框基本的过程就是设置⼀个下拉选择框的校验,然后绑定到sheet的指定格⼦上。
XSS和HSS的⽅式有些许不同,但是原理是⼀样的。
代码⽰例如下://性别String[] datas = new String[]{"男","⼥"};if(excelType.equals(ExcelTypeEnum.XLSX)){//数据验证帮助程序XSSFDataValidationHelper dvHelper2 = new XSSFDataValidationHelper((XSSFSheet) sheet);XSSFDataValidationConstraint dvConstraint2 = (XSSFDataValidationConstraint) dvHelper2.createExplicitListConstraint(datas);CellRangeAddressList regions2 =new CellRangeAddressList(1, 5000, 2, 2);XSSFDataValidation dataValidation2 = (XSSFDataValidation) dvHelper2.createValidation( dvConstraint2, regions2);sheet.addValidationData(dataValidation2);}else{//性别// 设置第5列的2-5000⾏为下拉列表CellRangeAddressList regions2 = new CellRangeAddressList(1, 5000, 2, 2);// 创建下拉列表数据DVConstraint constraint2 = DVConstraint.createExplicitListConstraint(datas);// 绑定HSSFDataValidation dataValidation2 = new HSSFDataValidation(regions2, constraint2);sheet.addValidationData(dataValidation2);}------------完整的⼀个⽰例代码如下。
如何在Excel中创建一个下拉菜单
如何在Excel中创建一个下拉菜单在Excel中创建一个下拉菜单是一个相当有用的技巧,可以使数据输入和管理更加方便和准确。
本文将介绍如何在Excel中创建一个下拉菜单的步骤和方法。
一、准备工作在创建下拉菜单之前,首先需要准备一个数据源,也就是下拉菜单的选项列表。
数据源可以是一个单独的工作表或同一工作表的一列。
二、选择单元格位置确定下拉菜单要显示的位置。
在Excel中,可以将下拉菜单放置在单个单元格中,也可以将其扩展到多个单元格区域。
选择一个合适的位置,可以根据实际需求进行选择。
三、打开数据有效性对话框在Excel中,创建下拉菜单需要使用“数据有效性”功能。
打开“数据有效性”对话框的方法如下:1. 选中要创建下拉菜单的单元格或单元格区域。
2. 在Excel菜单栏中选择“数据”选项卡,然后点击“数据工具”组中的“数据有效性”。
四、设置下拉菜单选项在“数据有效性”对话框中,选择“设置”选项卡,然后进行下列设置:1. 将“允许”选项设置为“列表”。
2. 在“来源”框中输入数据源。
a. 如果数据源是单独的工作表,则输入工作表名称和列范围,例如“Sheet1!$A$1:$A$5”。
b. 如果数据源是同一工作表的一列,则输入列范围或选择数据源时使用鼠标选中列。
3. 确保选中“忽略空值”和“在错误值中显示下拉箭头”选项。
五、确定设置在“设置”选项卡设置完毕后,点击“确定”按钮,即可创建下拉菜单。
此时,在选中的单元格或单元格区域中,将会显示一个下拉箭头。
六、使用下拉菜单点击下拉箭头,即可打开下拉菜单,选择其中的一个选项。
选中的选项将显示在当前单元格中。
如果下拉菜单位于多个单元格中,选中的选项将应用到所有单元格。
七、编辑下拉菜单选项如果需要添加、删除或编辑下拉菜单的选项,可以按照以下步骤进行操作:1. 选中包含下拉菜单的单元格或单元格区域。
2. 再次打开“数据有效性”对话框。
3. 在“设置”选项卡中,更改或添加新的数据源。
【POI】hutool万能工具的poi使用(Excel操作)
【POI】hutool万能⼯具的poi使⽤(Excel操作)POI技术(hutool⼯具的简单使⽤)POI: java技术,操作excel⽂档hutool-excel:常⽤poi功能,简化封装成⼯具类写出⽂档数据:(1)导出数据报表①获得能够向excel表格中输出信息对象[流]writer = ExcelUtil.getWriter("⽂件路径");注释:excel表格⽂件标准后缀:*.xls、*.xlsx② excel表格数据包含:表头:指明当前列数据的含义每⾏:多个单元格的数据;List<Object> | Map<字符串标题,Object>表格:多⾏数据。
List<Map<表头,Object数据>>③将数据写出到Excel⽂档:writer.write(list);④关闭流:writer.close();(2)向输出流中写⼊数据①创建⼀个写出的⼯具:ExcelWriter ew = ExcelUtil.getWriter();②将list多⾏数据集合写⼊:writer.write(list);③ flush,将数据写⼊到指定输出流中:writer.flush(outputStream);④关闭流:writer.close();(3)设置表格的sheet的名字writer.renameSheet("xxx")读⼊⽂档数据:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("⽂件路径");②读取⾥⾯的数据:List<Map<String,Object>> list = reader.readAll();③关闭流:reader.close();实例代码:导出:准备:导⼊POI的jar以及hutool的jar①⽅式⼀:(表格信息写到对应的⽂件路径)ExcelUtil.getWriter("⽂件路径"); //直接写到⽂件⾥②⽅式⼆:(表格信息写到特定的输出流⾥)List<Person> list = new ArrayList<Person>();persons.add(new Person("1001", "黄浩", 1, 18, "233456789", "郑州"));persons.add(new Person("1002", "杨宁", 1, 18, "233456789", "郑州"));persons.add(new Person("1003", "洪诗鹏", 1, 18, "233456789", "郑州"));// 重要将数据转化为hutool-excel,能够直接写出的数据结构:List<Map<String,Object>>// 创建⼀个存储多⾏数据的listList<Map<String, Object>> persons = new ArrayList<Map<String, Object>>();for (Person person : list) {// 每个person信息,代表⼀⾏数据:Map<String,person的属性>Map<String, Object> map = new LinkedHashMap<String, Object>();map.put("编号", person.getId());map.put("名字", person.getName());map.put("年龄", person.getAge());map.put("地址", person.getAddress());persons.add(map); // 将当前⾏的数据,加⼊persons}ExcelWriter writer = ExcelUtil.getWriter("D:/person.xlsx");// ①创建写出数据到⽂档中的⼯具writer.renameSheet("联系⼈信息表"); //设置sheet的名字writer.write(persons); // ②将数据写出到⽂档导出⼯具中writer.flush(输出流);//输出流:可以是⽂件输出流,也可以是控制器的响应流进⾏下载writer.close(); // ③关闭流导⼊:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("D:/person.xlsx");②读取⾥⾯的数据:List<Map<String, Object>> list = reader.readAll();③关闭流:reader.close();。
JAVA用POI从Excel读取数据进行相关统计,JFreeChart绘制图表
代码大概三百行吧,不多。
本来连接数据库做是个不错的选择,但是我刚刷了系统木有了又懒得装,从txt输入又感觉太low,最后就作死选择了以前从未尝试过的从Excel 输入,并碰到了各种问题_(:зゝ∠)_比如Cannot get a String value from a numeric cell 的异常错误,卡了我好久,直到无语地发现POI操作Excel时会无视Excel里的单元格设置,自判数据类型,所以还要使用setCellType.(*゜ー゜*)实现步骤(1)我用javax.swing.JFileChooser类来显示文件对话框,让用户选择一个Excel文件。
(2)使用Apache POI API从Excel文件中读取数据,对Employee类进行批量初始化。
(3)实现公司员工收入的相关统计,这里我实现了人数统计、最大/最小工龄查找、最大/最小工资查找、男女比例、平均工资、平均年龄、平均工龄等。
(4)建立Dataset。
将你所想要显示的数据都放到这个库中。
(5)建立JFreeChart对象。
将你的dataset填入到这个对象中。
(6)处理Chart中文显示问题(7)设置各种JFreeChart的属性和效果。
通过它提供的各种方法和接口设置相关的属性。
(8)用JFreeChart绘制图表,然后按照个人的需求进行执行。
(9)写界面,以swing形式输出。
测试截图(1)生成消息对话框,要求用户选择一个Excel文件,单击“确定”(2)生成文件选择器,我打开了存放在D盘BUAA文件夹里的Employee.xls补充说明:这是文件Employee.xls的内容(3)进行相关统计,并通过消息对话框显示统计结果(4)询问用户是否生成统计图,如果点“取消”或“否”,运行完毕;如果点是,系统将生成统计图,以员工为横轴,以年龄、工龄、工资三项数值为纵轴。
图表的显示效果会根据窗口大小自适应,改变横纵轴的比例尺。
下面是窗口最大化的效果程序清单1 2 3 4 5 6 7 8public class Employee {String ID;String name;String sex;double age;double workAge;double sal;9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) {this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}一共有两个:Employee.Java和EmployeeStatic.javaEmployeeStatic.javaimport java.awt.RenderingHints;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import javax.swing.JFileChooser;import javax.swing.JOptionPane;//org.apache.poiimport ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.Cell;import ermodel.Row;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;//org.jfreeimport org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import java.awt.Font;public class EmployeeStatics {public static void main(String[] args) {// TODO Auto-generated method stubJOptionPane.showMessageDialog(null,"\n您好,我是智能机器人小紫\n\n" + "很高兴为您提供员工数据统计分析服务\n\n"+ "请选择一个Excel文件 ^_^\n\n","选择Excel文件",RMATION_MESSAGE); ArrayList<Employee> Employees = null;//从Excel文件读取数据try {Employees = ReadFileUsingFileChooser();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//人数统计int n = Employees.size();//最大最小工资、工龄、工资初始化int maxA = 0;int minA = Integer.MAX_VALUE;int maxWA = 0;int minWA = Integer.MAX_VALUE;int maxS = 0;int minS = Integer.MAX_VALUE;//男女性别人数int M = 0;int FM = 0;double sumS, sumA, sumWA, avgS, avgA, avgWA, MFM; sumS = sumA = sumWA = 0;//遍历实现相关统计for (Employee e : Employees) {if(e.age > maxA)maxA = (int) e.age;if(e.age < minA)minA = (int) e.age;if(e.workAge > maxWA)maxWA = (int) e.workAge;if(e.workAge < minWA)minWA = (int) e.workAge;if(e.sal > maxS)maxS = (int) e.sal;if(e.sal < minS)minS = (int) e.sal;sumS += e.sal;sumA += e.age;sumWA += e.workAge;if (e.sex.equals("男"))M++;if (e.sex.equals("女"))FM++;}//计算平均值avgS = sumS / n;avgA = sumA / n;avgWA = sumWA / n;//计算男女比例MFM = (double) M / FM;JOptionPane.showMessageDialog(null,"员工人数为" + n + ",男女比例为" + MFM + "(男/女)\n"+ "平均年龄为" + avgA + ",平均工龄为" + avgWA + ",平均工资为" + avgS + "\n"+ "最高年龄为" + maxA + ",最低年龄为" + minA + ",最高工龄为" + maxWA + ",最低工龄为" + minWA + "\n"+ "最高工资为" + maxS + "K,最低工资为" + minS + "K\n");int option=JOptionPane.YES_OPTION;option=JOptionPane.showConfirmDialog(null, "是否显示员工数据统计图?");if (option==JOptionPane.YES_OPTION) {CategoryDataset dataset = getDataSet(Employees);//构造chartJFreeChart chart = ChartFactory.createBarChart3D("员工数据统计图", // 图表标题"员工属性", // 目录轴的显示标签--横轴"数值", // 数值轴的显示标签--纵轴dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、true, // 是否显示图例(对于简单的柱状图必须false, // 是否生成工具false// 是否生成URL链接);//处理chart中文显示问题processChart(chart);//chart 以swing形式输出ChartFrame pieFrame = new ChartFrame("员工数据统计图", chart);pieFrame.pack();pieFrame.setVisible(true);}}public static ArrayList<Employee>ReadFileUsingFileChooser()throws Ex ception {// TODO Auto-generated method stubJFileChooser fileChooser = new JFileChooser();ArrayList temp = new ArrayList();if (fileChooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {java.io.File file = fileChooser.getSelectedFile();FileInputStream fileIn = new FileInputStream(file);//根据指定的文件输入流导入Excel从而产生Workbook对象HSSFWorkbook wb0 = new HSSFWorkbook(fileIn);//获取Excel文档中的第一个表单HSSFSheet sht0 = wb0.getSheetAt(0);//对Sheet中的每一行进行迭代int r;int rowNum = sht0.getPhysicalNumberOfRows();for (r = 1; r <= rowNum; r++) {Row row = sht0.getRow(r);if (row == null) {break;}//创建实体类Employee info=new Employee();//取出当前行第1个单元格数据,并封装在info实体stuName属性上row.getCell(0).(Cell.);info.setID(row.getCell(0).getStringCellValue());info.setName(row.getCell(1).getStringCellValue());info.setSex(row.getCell(2).getStringCellValue());info.setAge(row.getCell(3).getNumericCellValue());info.setWorkAge(row.getCell(4).getNumericCellValue());info.setSal(row.getCell(5).getNumericCellValue());temp.add(info);}fileIn.close();}else {System.out.println("No file selected");}return temp;}//获取一个演示用的组合数据集对象private static CategoryDatasetgetDataSet(ArrayList<Employee> Employe es) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();for (Employee e : Employees){dataset.addValue(e.workAge, "工龄", );dataset.addValue(e.sal, "工资", );dataset.addValue(e.age, "年龄", );}return dataset;}//解决图表汉字显示问题private static void processChart(JFreeChart chart) {CategoryPlot plot = chart.getCategoryPlot();CategoryAxis domainAxis = plot.getDomainAxis();ValueAxis rAxis = plot.getRangeAxis();chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASI NG,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);TextTitle textTitle = chart.getTitle();textTitle.setFont(new Font("宋体", Font.PLAIN, 20));domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// renderer.setItemLabelGenerator(newLabelGenerator(0.0));// renderer.setItemLabelFont(newFont("宋体", Font.PLAIN, 12));//renderer.setItemLabelsVisible(true);}}Employee.javapublic class Employee {String ID;String name;String sex;double age;double workAge;double sal;public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) { this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}。
java动态生成带下拉框的Excel导入模板
java动态⽣成带下拉框的Excel导⼊模板在实际开发中,由于业务需要,常常需要进⾏Excel导⼊导出操作。
以前做⼀些简单的导⼊时,先准备⼀个模板,再进⾏导⼊,单有⼗⼏、⼆⼗⼏个导⼊模板时,往往要做⼗⼏、⼆⼗⼏个模板。
⽽且,当在模板中需要有下拉框,⽽且下拉数据要实时查询时,这样的⽅法就不太好了;现在,做成了动态⽣成导⼊模板,只要参数传对了,就可以⽣成任何我们想要的导⼊模板,⽽且随意设置下拉框的数⽬、位置。
具体步骤如下:1、需要⽤到的jar包:poi-3.10-FINAL.jarpoi-ooxml-3.10-FINAL.jarpoi-ooxml-schemas-3.10-FINAL.jargradle引⼊:compile group: 'org.apache.poi', name: 'poi', version: '3.10'compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.10-FINAL'2、⽣成Excel导⼊模板 :/*** @Title: createExcelTemplate* @Description: ⽣成Excel导⼊模板* @param@param filePath Excel⽂件路径* @param@param handers Excel列标题(数组)* @param@param downData 下拉框数据(数组)* @param@param downRows 下拉列的序号(数组,序号从0开始)* @return void* @throws*/private static void createExcelTemplate(String filePath, String[] handers,List<String[]> downData, String[] downRows){HSSFWorkbook wb = new HSSFWorkbook();//创建⼯作薄//表头样式HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式//字体样式HSSFFont fontStyle = wb.createFont();fontStyle.setFontName("微软雅⿊");fontStyle.setFontHeightInPoints((short)12);fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);style.setFont(fontStyle);//新建sheetHSSFSheet sheet1 = wb.createSheet("Sheet1");HSSFSheet sheet2 = wb.createSheet("Sheet2");HSSFSheet sheet3 = wb.createSheet("Sheet3");//⽣成sheet1内容HSSFRow rowFirst = sheet1.createRow(0);//第⼀个sheet的第⼀⾏为标题//写标题for(int i=0;i<handers.length;i++){HSSFCell cell = rowFirst.createCell(i); //获取第⼀⾏的每个单元格sheet1.setColumnWidth(i, 4000); //设置每列的列宽cell.setCellStyle(style); //加样式cell.setCellValue(handers[i]); //往单元格⾥写数据}//设置下拉框数据String[] arr = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};int index = 0;HSSFRow row = null;for(int r=0;r<downRows.length;r++){String[] dlData = downData.get(r);//获取下拉对象int rownum = Integer.parseInt(downRows[r]);if(dlData.length<5){ //255以内的下拉//255以内的下拉,参数分别是:作⽤的sheet、下拉内容数组、起始⾏、终⽌⾏、起始列、终⽌列sheet1.addValidationData(setDataValidation(sheet1, dlData, 1, 50000, rownum ,rownum)); //超过255个报错} else { //255以上的下拉,即下拉列表元素很多的情况//1、设置有效性//String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据String strFormula = "Sheet2!$"+arr[index]+"$1:$"+arr[index]+"$5000"; //Sheet2第A1到A5000作为下拉列表来源数据sheet2.setColumnWidth(r, 4000); //设置每列的列宽//设置数据有效性加载在哪个单元格上,参数分别是:从sheet2获取A1到A5000作为⼀个下拉的数据、起始⾏、终⽌⾏、起始列、终⽌列 sheet1.addValidationData(SetDataValidation(strFormula, 1, 50000, rownum, rownum)); //下拉列表元素很多的情况//2、⽣成sheet2内容for(int j=0;j<dlData.length;j++){if(index==0){ //第1个下拉选项,直接创建⾏、列row = sheet2.createRow(j); //创建数据⾏sheet2.setColumnWidth(j, 4000); //设置每列的列宽row.createCell(0).setCellValue(dlData[j]); //设置对应单元格的值} else { //⾮第1个下拉选项int rowCount = sheet2.getLastRowNum();//System.out.println("========== LastRowNum =========" + rowCount);if(j<=rowCount){ //前⾯创建过的⾏,直接获取⾏,创建列//获取⾏,创建列sheet2.getRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值} else { //未创建过的⾏,直接创建⾏、创建列sheet2.setColumnWidth(j, 4000); //设置每列的列宽//创建⾏、创建列sheet2.createRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值}}}index++;}}try {File f = new File(filePath); //写⽂件//不存在则新增if(!f.getParentFile().exists()){f.getParentFile().mkdirs();}if(!f.exists()){f.createNewFile();}FileOutputStream out = new FileOutputStream(f);out.flush();wb.write(out);out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}3、设置有效性:/**** @Title: SetDataValidation* @Description: 下拉列表元素很多的情况 (255以上的下拉)* @param@param strFormula* @param@param firstRow 起始⾏* @param@param endRow 终⽌⾏* @param@param firstCol 起始列* @param@param endCol 终⽌列* @param@return* @return HSSFDataValidation* @throws*/private static HSSFDataValidation SetDataValidation(String strFormula,int firstRow, int endRow, int firstCol, int endCol) {// 设置数据有效性加载在哪个单元格上。
【JAVA】POI生成EXCEL图表(柱状图、折线等)
【JAVA】POI⽣成EXCEL图表(柱状图、折线等)1、使⽤excel⼯具⾃带的图形⼯具创建⼀个图:2、绑定数据区域:3、数据区域绑定完成,我们要做的就是将数据写⼊到数据区域中:4、标记5、POI 引⼊包<!-- https:///artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><!-- https:///artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>6、代码:FileInputStream is = new FileInputStream("刚才创建的⽂件所在⽬录+⽂件名");XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);FileOutputStream os = new FileOutputStream("导出的位置");//获取创建⼯作簿的第⼀页XSSFSheet sheet = xssfWorkbook.getSheetAt(0);//⾃动计算sheet.setForceFormulaRecalculation(true);//给指定的sheet命名xssfWorkbook.setSheetName(0, "sheet0");//初始化当前的索引,设为当前sheet的最后⼀⾏⾏数int allRows = sheet.getLastRowNum();//存储当前表格的样式XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();//填充数据for(int i=allRows;i<=allRows;i++){XSSFRow row = sheet.getRow(i);if (row == null) {continue;}//遍历列for (int j = 1; j <=dailyReportPart8.size(); j++) {XSSFCell cell = row.getCell(j) != null ? row.getCell(j) : row.createCell(j); String cellValue = cell.getStringCellValue();if (cellValue.startsWith("#a1")) {cell.setCellValue(1);}}}//写出xssfWorkbook.write(os);//TODO 流的处理is.close();os.flush();os.close();。
poi设置单元格公式(一)
poi设置单元格公式(一)POI设置单元格公式概述在使用POI(Apache的开源Java库,用于操作Office文档)进行Excel开发过程中,我们经常需要设置单元格的公式。
通过设置单元格公式,我们可以在Excel表格中实现各种复杂的计算、数据分析和数据处理功能。
本文将介绍POI中设置单元格公式的相关知识,并举例说明不同类型的公式及其使用方法。
前提条件在正式介绍公式之前,我们先了解一些前提条件。
1.需要使用POI库进行Excel文件的读写操作。
2.为了方便说明,我们假设已经创建了一个工作簿对象Workbook,并获取了要操作的工作表对象Sheet,以及要设置公式的单元格对象Cell。
基本公式基本公式是Excel中最常用的公式,用于实现简单的加减乘除等基本运算。
以下是一些常用的基本公式及其示例:1.加法公式:在单元格中显示两个数值的和。
("A1+B1");2.减法公式:在单元格中显示两个数值的差。
("A1-B1");3.乘法公式:在单元格中显示两个数值的乘积。
("A1*B1");4.除法公式:在单元格中显示两个数值的商。
("A1/B1");函数公式函数公式是Excel中更为灵活和强大的公式,可以实现各种复杂的计算和数据分析功能。
以下是一些常用的函数公式及其示例:1.SUM函数:求一段区域内数值的总和。
("SUM(A1:A10)");2.AVG函数:求一段区域内数值的平均值。
("AVG(A1:A10)");3.MAX函数:求一段区域内数值的最大值。
("MAX(A1:A10)");4.MIN函数:求一段区域内数值的最小值。
("MIN(A1:A10)");自定义公式除了基本公式和函数公式,我们还可以定义自己的公式。
自定义公式可以根据具体需求进行编写,用于实现个性化的计算逻辑。
Java使用POI生成带联动下拉框的excel表格实例代码
Java使⽤POI⽣成带联动下拉框的excel表格实例代码废话不多说了,直接给⼤家贴代码了,具体代码如下所⽰:import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import ermodel.DVConstraint;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFDataValidation;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;import ermodel.DataValidation;import ;import org.apache.poi.ss.util.CellRangeAddressList;public class ExcelLinkage {// 样式private HSSFCellStyle cellStyle;// 初始化省份数据private List<String> province = new ArrayList<String>(Arrays.asList("湖南","⼴东"));// 初始化数据(湖南的市区)private List<String> hnCity = new ArrayList<String>(Arrays.asList("长沙市","邵阳市"));// 初始化数据(⼴东市区)private List<String> gdCity = new ArrayList<String>(Arrays.asList("深圳市","⼴州市"));public void setDataCellStyles(HSSFWorkbook workbook, HSSFSheet sheet) {cellStyle = workbook.createCellStyle();// 设置边框cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 设置背景⾊cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);// 设置居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置字体HSSFFont font = workbook.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 11); // 设置字体⼤⼩cellStyle.setFont(font);// 选择需要⽤到的字体格式// 设置单元格格式为⽂本格式(这⾥还可以设置成其他格式,可以⾃⾏百度)HSSFDataFormat format = workbook.createDataFormat();cellStyle.setDataFormat(format.getFormat("@"));}/*** 创建数据域(下拉联动的数据)** @param workbook* @param hideSheetName* 数据域名称*/private void creatHideSheet(HSSFWorkbook workbook, String hideSheetName) {// 创建数据域HSSFSheet sheet = workbook.createSheet(hideSheetName);// ⽤于记录⾏int rowRecord = 0;// 获取⾏(从0下标开始)HSSFRow provinceRow = sheet.createRow(rowRecord);// 创建省份数据this.creatRow(provinceRow, province);// 根据省份插⼊对应的市信息rowRecord++;for (int i = 0; i < province.size(); i++) {List<String> list = new ArrayList<String>();// 我这⾥是写死的,实际中应该从数据库直接获取更好if (province.get(i).toString().equals("湖南")) {// 将省份名称放在插⼊市的第⼀列,这个在后⾯的名称管理中需要⽤到list.add(0, province.get(i).toString());list.addAll(hnCity);} else {list.add(0, province.get(i).toString());list.addAll(gdCity);}//获取⾏HSSFRow Cityrow = sheet.createRow(rowRecord);// 创建省份数据this.creatRow(Cityrow, list);rowRecord++;}}/*** 创建⼀列数据** @param currentRow* @param textList*/public void creatRow(HSSFRow currentRow, List<String> text) {if (text != null) {int i = 0;for (String cellValue : text) {// 注意列是从(1)下标开始HSSFCell userNameLableCell = currentRow.createCell(i++);userNameLableCell.setCellValue(cellValue);}}}/*** 名称管理** @param workbook* @param hideSheetName* 数据域的sheet名*/private void creatExcelNameList(HSSFWorkbook workbook, String hideSheetName) { Name name;name = workbook.createName();// 设置省名称name.setNameName("province");name.setRefersToFormula(hideSheetName + "!$A$1:$"+ this.getcellColumnFlag(province.size())+ "$1");// 设置省下⾯的市for (int i = 0; i < province.size(); i++) {List<String> num = new ArrayList<String>();if (province.get(i).toString().equals("湖南")) {name = workbook.createName();num.add(0,province.get(i).toString());num.addAll(hnCity);name.setNameName(province.get(i).toString());name.setRefersToFormula(hideSheetName + "!$B$" + (i + 2) + ":$"+ this.getcellColumnFlag(num.size()) + "$" + (i + 2));} else {name = workbook.createName();num.add(0,province.get(i).toString());num.addAll(gdCity);name.setNameName(province.get(i).toString());name.setRefersToFormula(hideSheetName + "!$B$" + (i + 2) + ":$"+ this.getcellColumnFlag(num.size()) + "$" + (i + 2));}}}// 根据数据值确定单元格位置(⽐如:28-AB)private String getcellColumnFlag(int num) {String columFiled = "";int chuNum = 0;int yuNum = 0;if (num >= 1 && num <= 26) {columFiled = this.doHandle(num);} else {chuNum = num / 26;yuNum = num % 26;columFiled += this.doHandle(chuNum);columFiled += this.doHandle(yuNum);}return columFiled;}private String doHandle(final int num) {String[] charArr = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J","K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V","W", "X", "Y", "Z" };return charArr[num - 1].toString();}/*** 使⽤已定义的数据源⽅式设置⼀个数据验证** @param formulaString* @param naturalRowIndex* @param naturalColumnIndex* @return*/public DataValidation getDataValidationByFormula(String formulaString, int naturalRowIndex, int naturalColumnIndex) {// 加载下拉列表内容DVConstraint constraint = DVConstraint.createFormulaListConstraint(formulaString);// 设置数据有效性加载在哪个单元格上。
POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生
POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生POI是一个用于操作Microsoft Office格式文件的Java库。
通过POI库,可以实现对Excel、Word和PowerPoint文件的读写操作。
本文将介绍POI库的一些常用操作,包括动态合并单元格、为单元格生成自定义的数据显示格式、自定义公式计算结果等。
一、动态合并单元格在Excel中,可以将多个相邻的单元格合并成一个单元格,以便显示更大的数据块。
POI库可以很方便地实现对合并单元格的操作。
1.创建合并区域:```javaCellRangeAddress region = new CellRangeAddress(rowStart, rowEnd, colStart, colEnd);sheet.addMergedRegion(region);```其中,rowStart和rowEnd表示合并区域的起始行和结束行,colStart和colEnd表示合并区域的起始列和结束列。
2.设置合并单元格的值:```javaCell cell = sheet.getRow(rowStart).createCell(colStart);cell.setCellValue("合并单元格的值");```这里,我们取合并区域的起始行和起始列,设置单元格的值。
二、为单元格生成一个自定义的数据显示格式在Excel中,可以对单元格的值设置格式,以便以不同的方式展示数据。
POI库提供了设置单元格格式的方法。
1.创建格式对象:```javaCellStyle cellStyle = workbook.createCellStyle(;```2.设置格式:```javaDataFormat dataFormat = workbook.createDataFormat(;short format = dataFormat.getFormat("自定义格式");cellStyle.setDataFormat(format);```其中,"自定义格式"是Excel中的一种格式化字符串。
如何在Excel中创建和使用下拉列表
如何在Excel中创建和使用下拉列表Excel是一款功能强大的电子表格软件,它不仅可以用于数学、统计和数据分析,还可以辅助我们进行数据的整理和管理。
下拉列表是Excel提供的一个实用功能,可以帮助我们在输入数据时提供选择的范围,提高数据输入的准确性和效率。
本文将介绍如何在Excel中创建和使用下拉列表。
一、创建下拉列表下拉列表可以用于选择性的数据输入,比如在一个表格中的特定区域只能输入特定的一组值。
下面是在Excel中创建下拉列表的步骤:步骤一:打开Excel并选择要创建下拉列表的单元格或区域。
步骤二:在Excel的菜单栏中,依次选择“数据”-“数据工具”-“数据验证”。
步骤三:在弹出的数据验证对话框中,选择“设置”选项卡。
步骤四:在“允许”下拉框中选择“列表”。
步骤五:在“来源”输入框中输入数据源的范围,可以是单个单元格或一列数据的范围。
例如,输入A1:A5表示数据源范围为表格中A1到A5这五个单元格的值。
步骤六:勾选“忽略空值”选项,以防止在下拉列表中出现空白选项。
步骤七:点击“确定”按钮,完成下拉列表的创建。
下拉列表创建完成后,我们就可以在相应的单元格中使用它了。
下面是使用下拉列表的步骤:步骤一:点击要使用下拉列表的单元格,将光标放置在单元格内。
步骤二:点击单元格右侧的下拉箭头,列表中将显示之前设置的数据源范围的数据值。
步骤三:点击下拉列表中的值,或直接输入对应的值,完成数据输入。
三、修改下拉列表在Excel中,我们可以对已创建的下拉列表进行修改和调整。
比如修改数据源范围、增加或删除下拉选项等。
下面是修改下拉列表的步骤:步骤一:选中包含下拉列表的单元格或区域。
步骤二:在Excel的菜单栏中,依次选择“数据”-“数据工具”-“数据验证”。
步骤三:在弹出的数据验证对话框中,选择“设置”选项卡。
步骤四:修改“来源”输入框中的数据源范围,可以添加或删除单元格范围。
步骤五:点击“确定”按钮,完成下拉列表的修改。
java使用poi自定义excel标题头并导出(springmvc+poi)
java使⽤poi⾃定义excel标题头并导出(springmvc+poi)项⽬使⽤的是jeecg开源框架(springmvc+spring+hibernate+。
等)此代码仅供参考!如有更好的意见或建议可留⾔。
创建excel⼤致分这⼏步:1、创建HSSFWorkbook对象(也就是excel⽂档对象)2、通过HSSFWorkbook对象创建sheet对象(也就是excel中的sheet)3、通过sheet对象创建HSSFROW对象(row⾏对象)4、通过HSSFROW对象创建列cell并set值(列名)1 controller 层23/**4 * excel⾃定义导出5 * @param hAqscTieupsummary6 * @param request7 * @param response8 * @param dataGrid9 * @param modelMap10 * @return11*/12 @SuppressWarnings("deprecation")13 @RequestMapping(params = "exportEXL")14public String exportEXL(HAqscTieupsummaryEntity hAqscTieupsummary,15 HttpServletRequest request, HttpServletResponse response,16 DataGrid dataGrid, ModelMap modelMap) {17try {18 String dateType = "yyyy";19 SimpleDateFormat df = new SimpleDateFormat(dateType);// 设置⽇期格式20 SimpleDateFormat df1 = new SimpleDateFormat("yyyy.MM.dd");// 设置⽇期格式21// 创建HSSFWorkbook对象(excel的⽂档对象)22 HSSFWorkbook wb = new HSSFWorkbook();23 HSSFRow row = null;24 HSSFCell cell = null;25// 建⽴新的sheet对象(excel的表单)并设置sheet名字26 HSSFSheet sheet = wb.createSheet("占压管线台账信息");27 sheet.setDefaultRowHeightInPoints(30);// 设置缺省列⾼sheet.setDefaultColumnWidth(20);//设置缺省列宽28//----------------标题样式---------------------29 HSSFCellStyle titleStyle = wb.createCellStyle(); //标题样式30 titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);31 titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);32 Font ztFont = wb.createFont();33 ztFont.setItalic(false); // 设置字体为斜体字34 ztFont.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”35 ztFont.setFontHeightInPoints((short)16); // 将字体⼤⼩设置为18px36 ztFont.setFontName("宋体"); // 将“宋体”字体应⽤到当前单元格上37 ztFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗38// ztFont.setUnderline(Font.U_DOUBLE); // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)39// ztFont.setStrikeout(true); // 是否添加删除线40 titleStyle.setFont(ztFont);41//-------------------------------------------42//----------------⼆级标题格样式----------------------------------43 HSSFCellStyle titleStyle2 = wb.createCellStyle(); //表格样式44 titleStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);45 titleStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);46 Font ztFont2 = wb.createFont();47 ztFont2.setItalic(false); // 设置字体为斜体字48 ztFont2.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”49 ztFont2.setFontHeightInPoints((short)11); // 将字体⼤⼩设置为18px50 ztFont2.setFontName("宋体"); // 字体应⽤到当前单元格上51 ztFont2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗52// ztFont.setUnderline(Font.U_DOUBLE); // 添加(Font.U_SINGLE单条下划线/Font.U_DOUBLE双条下划线)53// ztFont.setStrikeout(true); // 是否添加删除线54 titleStyle2.setFont(ztFont2);55//----------------------------------------------------------56//----------------单元格样式----------------------------------57 HSSFCellStyle cellStyle = wb.createCellStyle(); //表格样式58 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);59 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);60 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框61 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框62 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框63 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框64 Font cellFont = wb.createFont();65 cellFont.setItalic(false); // 设置字体为斜体字66 cellFont.setColor(Font.COLOR_NORMAL); // 将字体设置为“红⾊”67 cellFont.setFontHeightInPoints((short)10); // 将字体⼤⼩设置为18px68 cellFont.setFontName("宋体"); // 字体应⽤到当前单元格上69// cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);70 cellStyle.setFont(cellFont);71 cellStyle.setWrapText(true);//设置⾃动换⾏72//----------------------------------------------------------73// ----------------------创建第⼀⾏---------------74// 在sheet⾥创建第⼀⾏,参数为⾏索引(excel的⾏),可以是0~65535之间的任何⼀个75 row = sheet.createRow(0);76// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何⼀个77 cell = row.createCell(0);78// 合并单元格CellRangeAddress构造参数依次表⽰起始⾏,截⾄⾏,起始列,截⾄列79 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 19));80// 设置单元格内容81 cell.setCellValue("占压城市地下管线、输油⽓管道、化⼯产品管道违法违规建设汇总表");82 cell.setCellStyle(titleStyle);83// ----------------------------------------------8485// ------------------创建第⼆⾏(单位、填表⽇期)---------------------86 row = sheet.createRow(1); // 创建第⼆⾏87 cell = row.createCell(0);88 cell.setCellValue("填报单位名称(盖章): ");89 cell.setCellStyle(titleStyle2);90 sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 3));91 cell = row.createCell(4);92 sheet.addMergedRegion(new CellRangeAddress(1, 1, 4, 5));93 TSBaseUser tb = ResourceUtil.getSessionUserName(); //获取当前登录⽤户信息94 String uid = tb.getId();95 String deptId = userDao.getDeptId(uid);96 String deptName = userDao.getDeptName(deptId);97 cell.setCellValue(deptName);98// cell.setCellValue("*****");99 cell.setCellStyle(titleStyle2);100 cell = row.createCell(13); // 填表时间101 sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 16));102 cell.setCellValue("填表时间:"+df1.format(new Date()));103 cell.setCellStyle(titleStyle2);104// HSSFCell cell14 = row.createCell(15); // 填表时间105// cell14.setCellValue();106// cell14.setCellValue("2017.11.30");107// cell14.setCellStyle(titleStyle2);108// ----------------------------------------------109110// ------------------创建表头start---------------------111 row = sheet.createRow(2); // 创建第三⾏112 sheet.addMergedRegion(new CellRangeAddress(2, 3, 0, 0));113 cell = row.createCell(0);114 cell.setCellValue("序号");115 cell.setCellStyle(cellStyle);116117 sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));118 cell = row.createCell(1);119 cell.setCellValue("隐患等级评定");120 cell.setCellStyle(cellStyle);121122 sheet.addMergedRegion(new CellRangeAddress(2, 3, 2, 2));123 cell = row.createCell(2);124 cell.setCellValue("隐患名称");125 cell.setCellStyle(cellStyle);126127 sheet.addMergedRegion(new CellRangeAddress(2, 2, 3, 5));128 cell = row.createCell(3);129 cell.setCellValue("位置描述");130 cell.setCellStyle(cellStyle);131132 cell = row.createCell(4);133 cell.setCellStyle(cellStyle);134 cell = row.createCell(5);135 cell.setCellStyle(cellStyle);136137 sheet.addMergedRegion(new CellRangeAddress(2, 2, 6, 10));138 cell = row.createCell(6);139 cell.setCellValue("管线情况");140 cell.setCellStyle(cellStyle);141142 cell = row.createCell(7);143 cell.setCellStyle(cellStyle);144 cell = row.createCell(8);145 cell.setCellStyle(cellStyle);146 cell = row.createCell(9);147 cell.setCellStyle(cellStyle);148 cell = row.createCell(10);149 cell.setCellStyle(cellStyle);150151 sheet.addMergedRegion(new CellRangeAddress(2, 2, 11, 13));152 cell = row.createCell(11);153 cell.setCellValue("占压物情况");154 cell.setCellStyle(cellStyle);155157 cell.setCellStyle(cellStyle);158 cell = row.createCell(13);159 cell.setCellStyle(cellStyle);160161 sheet.addMergedRegion(new CellRangeAddress(2, 2, 14, 14)); 162 cell = row.createCell(14);163 cell.setCellValue("占压物⽤途");164 cell.setCellStyle(cellStyle);165166 sheet.addMergedRegion(new CellRangeAddress(2, 3, 15, 15)); 167 cell = row.createCell(15);168 cell.setCellValue("已采⽤的安全防护措施");169 cell.setCellStyle(cellStyle);170171 sheet.addMergedRegion(new CellRangeAddress(2, 3, 16, 16)); 172 cell = row.createCell(16);173 cell.setCellValue("备注");174 cell.setCellStyle(cellStyle);175176 sheet.addMergedRegion(new CellRangeAddress(2, 3, 17, 17)); 177 cell = row.createCell(17);178 cell.setCellValue("联系⼈电话");179 cell.setCellStyle(cellStyle);180181 sheet.addMergedRegion(new CellRangeAddress(2, 3, 18, 18)); 182 cell = row.createCell(18);183 cell.setCellValue("是否已和区管委和供热办联系");184 cell.setCellStyle(cellStyle);185186 sheet.addMergedRegion(new CellRangeAddress(2, 3, 19, 19)); 187 cell = row.createCell(19);188 cell.setCellValue("是否采取防范措施");189 cell.setCellStyle(cellStyle);190191//--------------------------- 创建第四⾏--------------------192 row = sheet.createRow(3);193 sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 3)); 194 cell = row.createCell(3);195 cell.setCellValue("所在区县");196 cell.setCellStyle(cellStyle);197198 cell = row.createCell(0);199 cell.setCellStyle(cellStyle);200201 sheet.addMergedRegion(new CellRangeAddress(3, 3, 4, 4)); 202 cell = row.createCell(4);203 cell.setCellValue("所在街道");204 cell.setCellStyle(cellStyle);205206 cell = row.createCell(1);207 cell.setCellStyle(cellStyle);208209 sheet.addMergedRegion(new CellRangeAddress(3, 3, 5, 5)); 210 cell = row.createCell(5);211 cell.setCellValue("详细地址");212 cell.setCellStyle(cellStyle);213214 sheet.addMergedRegion(new CellRangeAddress(3, 3, 6, 6)); 215 cell = row.createCell(6);216 cell.setCellValue("管线建成时间");217 cell.setCellStyle(cellStyle);218219 sheet.addMergedRegion(new CellRangeAddress(3, 3, 7, 7)); 220 cell = row.createCell(7);221 cell.setCellValue("管线埋深");222 cell.setCellStyle(cellStyle);223224 sheet.addMergedRegion(new CellRangeAddress(3, 3, 8, 8)); 225 cell = row.createCell(8);226 cell.setCellValue("管径");227 cell.setCellStyle(cellStyle);228229 sheet.addMergedRegion(new CellRangeAddress(3, 3, 9, 9)); 230 cell = row.createCell(9);231 cell.setCellValue("管线压⼒等级");232 cell.setCellStyle(cellStyle);233234 sheet.addMergedRegion(new CellRangeAddress(3, 3, 10, 10)); 235 cell = row.createCell(10);236 cell.setCellValue("占压管线长度");237 cell.setCellStyle(cellStyle);238239 sheet.addMergedRegion(new CellRangeAddress(3, 3, 11, 11));241 cell.setCellValue("占压单位(个⼈)名称");242 cell.setCellStyle(cellStyle);243244 sheet.addMergedRegion(new CellRangeAddress(3, 3, 12, 12));245 cell = row.createCell(12);246 cell.setCellValue("占压物建成时间");247 cell.setCellStyle(cellStyle);248249 sheet.addMergedRegion(new CellRangeAddress(3, 3, 13, 13));250 cell = row.createCell(13);251 cell.setCellValue("占压物⾯积(平⽅⽶)");252 cell.setCellStyle(cellStyle);253254 sheet.addMergedRegion(new CellRangeAddress(3, 3, 14, 14));255 cell = row.createCell(14);256 cell.setCellValue("经营、出租、⾃⽤、居住");257 cell.setCellStyle(cellStyle);258259 cell = row.createCell(15);260 cell.setCellStyle(cellStyle);261 cell = row.createCell(16);262 cell.setCellStyle(cellStyle);263 cell = row.createCell(17);264 cell.setCellStyle(cellStyle);265 cell = row.createCell(18);266 cell.setCellStyle(cellStyle);267 cell = row.createCell(19);268 cell.setCellStyle(cellStyle);269//-------------------------表头end---------------------270 CriteriaQuery cq = new CriteriaQuery(HAqscTieupsummaryEntity.class,271 dataGrid);272 org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq,273 hAqscTieupsummary, request.getParameterMap());274 List<HAqscTieupsummaryEntity> hAqscTieupsummarys = this.hAqscTieupsummaryService 275 .getListByCriteriaQuery(cq, false);276for (int i = 0; i < hAqscTieupsummarys.size(); i++) { //向表格插⼊数据277 List<Object> data = new ArrayList<>(); //将前台传来的数据存⼊到list中278// System.out.println(hAqscTieupsummarys.get(i).getSeqNum());279 HAqscTieupsummaryEntity entity = hAqscTieupsummarys.get(i);280 data.add(entity.getSeqNum());281 String yhjb = entity.getYhDjpd();282 String hyjb = dao.getHyjb(yhjb);283 data.add(hyjb); //隐患级别284 data.add(entity.getYhName());285 String countryName = dao.getCountryByCode(entity.getAtcounty()); //区县286 data.add(countryName);287 String code = entity.getAtdistrict();288 String streetName = dao.getStreetByCode(code); //街道289 data.add(streetName);290 data.add(entity.getAddress());291 Date buildtime = entity.getPipelineBuildtime();292if (buildtime!=null) {293 String format = df.format(buildtime);294 data.add(format);295 }else{296 data.add("");297 }298 data.add(entity.getPipelineDepth());299 data.add(entity.getPipeSize());300 data.add(entity.getPipelinePr());301 data.add(entity.getTppipelineLength());302 data.add(entity.getTieupName());303 Date goodsBuildtime = entity.getTieupgoodsBuildtime();304if (buildtime!=null) {305 String format = df.format(goodsBuildtime);306 data.add(format);307 }else{308 data.add("");309 }310 data.add(entity.getTieupgoodsArea());311 String useType = entity.getTieupgoodsUse();312 data.add(dao.getUseType(useType));313 data.add(entity.getUseSecuritymeasures());314 data.add(entity.getRemark());315 data.add(entity.getTelephone());316 data.add(dao.getIsContact(entity.getIsContact()));317 data.add(entity.getIsUsesecuritymeasures());318int rowNum = 4+i; //从第四⾏开始319 row = sheet.createRow(rowNum);320for (int j = 0; j < data.size(); j++) { //将数据添加到单元格中321// System.out.println(data.get(j));322 sheet.addMergedRegion(new CellRangeAddress(rowNum, rowNum, j, j));323 cell = row.createCell(j);324 cell.setCellValue(""+data.get(j)+"");325 cell.setCellStyle(cellStyle);326 }327 }328329// 输出Excel⽂件330 OutputStream output = response.getOutputStream();331 response.reset();332 response.setHeader("Content-disposition",333 "attachment; filename=details.xls"); //filename = ⽂件名334 response.setContentType("application/msexcel");335 wb.write(output);336 output.close();337 } catch (IOException e) {338// TODO Auto-generated catch block339 e.printStackTrace();340 }341return null;342 }1前台请求地址:2 <t:dgToolBar title="导出" icon="icon-putout" funname="ExportXls"></t:dgToolBar>3//导出4function ExportXls() {5 JeecgExcelExport("hAqscTieupsummaryController.do?exportEXL","hAqscTieupsummaryList");6 }View Codeexcel导出模版如下:。
easy poi下拉框 模版 写法
Easy POI是一个用于生成Excel和Word文档的Java API库,它提供了许多方便快捷的操作方式,其中包括对下拉框模板的写法。
在本文中,我将针对easy poi下拉框模板的写法进行深入探讨,并共享我的个人观点和理解。
让我们来了解一下easy poi下拉框模板的基本概念。
在使用Easy POI 库生成Excel文档时,有时我们需要向特定单元格添加下拉框,以便用户在填写表格时能够从预设的选项中进行选择。
这种下拉框的设置在实际工作中非常常见,比如在数据录入和报表生成等场景中都会用到。
针对easy poi下拉框模板的写法,我们需要考虑以下几个方面:1. 数据源:在设置下拉框时,需要指定下拉框的数据源,也就是用户可以选择的选项列表。
在Easy POI中,我们可以使用DataValidationHelper类来创建下拉框的数据源,可以是一个固定的字符串数组,也可以是一个动态获取的列表数据。
2. 区域设置:除了数据源之外,还需要指定下拉框的作用区域,也就是下拉框所在的单元格范围。
在Easy POI中,我们可以使用DataValidationHelper类的createFormulaListConstraint方法来设置下拉框的区域。
3. 下拉框类型:Easy POI支持不同类型的下拉框,包括普通下拉框和日期下拉框。
在设置下拉框时,我们需要根据实际需求选择合适的下拉框类型,并按照相应的方式进行设置。
4. 模板写法:在实际操作中,我们通常会将下拉框的设置作为模板,以便在生成多个相似结构的Excel文档时能够重复使用。
在Easy POI 中,我们可以将下拉框的设置逻辑封装为模板,以便在需要时进行调用和生成。
基于以上几点,我认为在编写easy poi下拉框模板时,需要遵循以下步骤:第一步,确定下拉框的数据源,包括静态数据源和动态数据源,根据需要进行选择。
第二步,设置下拉框的作用区域,根据实际需求确定下拉框所在的单元格范围。
java excel复选框代码
一、介绍Java是一种面向对象的编程语言,具有跨评台、高性能、安全性好等特点,而Excel是一款广泛应用的电子表格软件,具有处理数据、制作图表等强大功能。
在Java中操作Excel文件是一项常见的任务,其中复选框是一种常见的元素,本文将介绍如何使用Java代码操作Excel中的复选框。
二、复选框的添加在Java中操作Excel文件通常使用Apache POI库,首先需导入相应的jar包,并创建一个新的Excel文件。
通过POI库的API可以在指定位置创建复选框,并指定复选框的默认选中状态。
```java// 创建一个新的Excel文件Workbook wb = new HSSFWorkbook();Sheet sheet = wb.createSheet("Sheet1");// 创建一个单元格,并设置其数据格式为复选框Row row = sheet.createRow(0);Cell cell = row.createCell(0);Drawing patriarch = sheet.createDrawingPatriarch(); ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 0, 0, (short) 1, 1);Checkbox checkbox = patriarch.createCheckbox(anchor); cell.setCellType(CellType.FORMULA);cell.setCellFormula("=A1");// 设置复选框的默认选中状态checkbox.setIsChecked(true);```三、复选框的状态获取在操作Excel文件时,有时需要获取复选框的选中状态,这可以通过POI库的API实现。
```java// 获取复选框的选中状态CellReference cellRef = new CellReference("A1");Row row = sheet.getRow(cellRef.getRow());Cell cell = row.getCell(cellRef.getCol());XSSFPatriarch patriarch = (XSSFPatriarch)sheet.createDrawingPatriarch();XSSFCheckbox checkbox = patriarch.getCheckbox(cell); boolean isChecked = checkbox.getChecked();```四、复选框的状态设置除了获取复选框的选中状态,有时也需要动态地修改复选框的状态。
java的poi用法
Java的POI(Poor Obfuscation Implementation)是一个用于处理Microsoft Office文档的Java库,主要包括对Excel、Word和PowerPoint等文件的读写操作。
以下是一个简单的Java POI用法示例:1. 首先,需要在项目中引入Apache POI依赖。
如果使用Maven,可以在pom.xml文件中添加以下依赖:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.0</version></dependency>```2. 创建一个Java类,实现读取Excel文件的功能:```javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class ReadExcel {public static void main(String[] args) {try {FileInputStream excelFile = new FileInputStream(new File("example.xlsx"));Workbook workbook = new XSSFWorkbook(excelFile);Sheet sheet = workbook.getSheetAt(0);for (Row row : sheet) {for (Cell cell : row) {switch (cell.getCellType()) {case STRING:System.out.print(cell.getStringCellValue() + "\t");break;case NUMERIC:System.out.print(cell.getNumericCellValue() + "\t");break;case BOOLEAN:System.out.print(cell.getBooleanCellValue() + "\t");break;default:System.out.print("N/A\t");break;}}System.out.println();}workbook.close();} catch (IOException e) {e.printStackTrace();}}}```这个示例中,我们首先创建了一个`FileInputStream`对象来读取名为"example.xlsx"的Excel文件。
springboot中使用java操作poi案例(excel数据写入与导出)
springboot中使⽤java操作poi案例(excel数据写⼊与导出)1.⼯程导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency>这⾥导⼊两个poi的原因是:在excel的表格保存为xls和xlsx两种格式,excel表格早先是xls后来⼜加⼊了xlsx的格式,在下⾯的代码中会有所体现。
2.编写demo@RestController@RequestMapping("/POI")public class POIController {@RequestMapping("/createExcel")public void createExcel(){//HSSFWorkbook wb = new HSSFWorkbook();XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheets= wb.createSheet("九九乘法表");for (int i=1;i<=9;i++){XSSFRow row = sheets.createRow(i - 1);for (int j = 1; j<= 9; j++) {XSSFCell cell = row.createCell(j - 1);cell.setCellValue(i+"*"+j+"="+i*j);}}try {FileOutputStream fileOutputStream = new FileOutputStream("d:\\test.xlsx");try {wb.write(fileOutputStream);} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}}}⾥注意的点是在上图创建excel⼯作簿的时候有两种⽅式,如下所⽰:HSSFWorkbook wb = new HSSFWorkbook();//⽣成xls格式的excelXSSFWorkbook wb = new XSSFWorkbook();//⽣成xlsx格式的excel3.poi的整个设计是根据excel表格的特性来做的,⼤致思路是:3.1 通过HSSFWorkbook wb = new HSSFWorkbook()或 XSSFWorkbook wb = new XSSFWorkbook()⽣成excel⼯作簿(wb)3.2 通过创建好的⼯作簿去创建⼯作表(sheet)3.3 通过⼯作表去创建表中的⾏(row),⾏⾥索要填的内容就是单元格的内容(cell)最后,提供了⼯作簿(wb)、⼯作表(sheet)、表中的⾏(row)、⾏内容的单元格(cell)分别的api,⾃⼰稍微摸索⼀下就能。
poi导出excel单元格setfillforegroundcolor -回复
poi导出excel单元格setfillforegroundcolor -回复如何使用POI导出Excel单元格设置填充前景色POI是一个流行的Java API,用于处理Microsoft Office格式的文件,包括Excel。
当我们使用POI导出Excel时,有时候需要为单元格设置填充前景色以增加数据的可视化效果。
本文将一步步介绍如何使用POI来实现这一功能。
首先,我们需要确保你已经下载并正确引入了POI库。
如果你还没有下载POI,可以在Apache的官方网站上找到并下载最新版本。
一旦你完成了POI库的下载和引入,我们就可以开始编写代码了。
下面是一步步的操作。
步骤1:创建一个新的Excel文档首先,我们需要创建一个新的Excel文档。
我们可以使用`XSSFWorkbook`类来创建一个新的工作簿实例。
下面是创建一个新的Excel工作簿的代码示例:javaXSSFWorkbook workbook = new XSSFWorkbook();步骤2:创建一个工作表接下来,我们需要在工作簿中创建一个工作表。
我们可以使用`createSheet()`方法来创建一个新的工作表。
下面是创建一个新的工作表的代码示例:javaXSSFSheet sheet = workbook.createSheet("Sheet1");步骤3:创建一个行一旦我们创建了工作表,我们就可以在工作表中创建行了。
我们可以使用`createRow()`方法来创建一行。
下面是创建一行的代码示例:javaXSSFRow row = sheet.createRow(0);步骤4:创建一个单元格接下来,我们需要在行中创建单元格。
我们可以使用`createCell()`方法来创建一个单元格。
下面是创建一个单元格的代码示例:javaXSSFCell cell = row.createCell(0);步骤5:设置填充前景色现在我们已经创建了一个单元格,我们可以使用`getCellStyle()`方法和`setFillForegroundColor()`方法来设置填充前景色。
poi合并单元格、设置边框
poi合并单元格、设置边框HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();//创建⼀个样式HSSFCellStyle styleBorderThin= wb.createCellStyle();setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框HSSFRow row=sheet.createRow(2); //第三⾏sheet.addMergedRegion(new CellRangeAddress(2, //first row (0-based)2, //last row (0-based)1, //first column (0-based)//last column (0-based))); //第三⾏的第2列到第6列(即B到F)合并单元格row.createCell(1).setCellValue("答案选项"); //赋值row.createCell(2);row.createCell(3);row.createCell(4);row.createCell(5);row.createCell(6).setCellValue("回复情况");for (Cell cell : row) {cell.setCellStyle(styleBorderThin);}这⾥需要解释的是因为1-6是合并单元格,值取的是第⼀个单元格的值,所以后⾯的单元格赋不赋值都⽆所谓,但是⼀定要createCell,row.createCell(2);row.createCell(3);row.createCell(4);row.createCell(5); 这⼀些并不是没意义的,如果去掉的话错误结果就是这样的:加上了2-5的createCell以后的正确结果:另外,我发现了⼀个有趣的地⽅,excel在操作合并单元格的时候,如果除了被合并的⾸个单元格以外的其他单元格也有值,会提⽰。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java使用POI操作Excel并创建下拉框Java代码
package poiexcel;
import java.io.FileOutputStream;
import java.util.Date;
import ermodel.DVConstraint;
import ermodel.HSSFCell;
import ermodel.HSSFDataValidation;
import ermodel.HSSFRow;
import ermodel.HSSFSheet;
import ermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddressList;
public class POI
{
public static void main(String [] args)
{
String [] list={"东软","华信","SAP","海辉"};
new POI().createListBox(list);
return;
}
public void createListBox (String [] list)
{
//文件初始化
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");
//在第一行第一个单元格,插入下拉框
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
//普通写入操作
cell.setCellValue("请选择");//这是实验
//生成下拉列表
//只对(0,0)单元格有效
CellRangeAddressList regions = new CellRangeAddressList(0,0,0,0);
//生成下拉框内容
DVConstraint constraint = DVConstraint.createExplicitListConstraint(list);
//绑定下拉框和作用区域
HSSFDataValidation data_validation = new HSSFDataValidation(regions,constraint); //对sheet页生效
sheet.addValidationData(data_validation);
//写入文件
FileOutputStream fileOut;
try {
fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
} catch (Exception e) {
// TODO Auto-generated catch block e.printStackTrace();
}
//结束
System.out.println("Over");
}
}。