1 1、首先在Java头引入Poi插件。 2 3 package poiExcel; 4 5 //输入输出到文件必备 6 import java.io.*; 7 8 import org.apache.poi.hssf.usermodel.*; 9 import org.apache.poi.hssf.util.*; 10 import org.apache.poi.poifs.filesystem.*; 11 2、先是把C:\1.xls的内容读取到Java里面来,逐个单元格输出 12 public static void ExcelRead() throws Exception { 13 //确定要操作的是c:/1.xls 14 HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem( 15 new FileInputStream("c:/1.xls"))); 16 //取第0个单元表 17 HSSFSheet sheet = workbook.getSheetAt(0); 18 //sheet.getPhysicalNumberOfRows();求出所有行数 19 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { 20 //取一行操作 21 HSSFRow row = sheet.getRow(i); 22 //row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数 23 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { 24 System.out.print(row.getCell(j) + "\t"); 25 } 26 System.out.println(); 27 } 28 } 29 3、之后是在Java设置好整个单元格的样式,输出到Excel中。整个过程有点像JavaScript操作HTML的DOM节点。先构造单元格、再通过单元格构造行、最后通过行构造整张表,再把整张表输出的过程。 30 public static void ExcelWrite() { 31 32 // 创建一个webbook,对应一个Excel文件 33 HSSFWorkbook workbook = new HSSFWorkbook(); 34 // 在webbook中添加一个Excel单元表sheet,并设置单元表的问题 35 HSSFSheet sheet = workbook.createSheet("单元表标题"); 36 37 // 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制 38 HSSFRow row = sheet.createRow(0); 39 // 创建一个居中样式 40 HSSFCellStyle style = workbook.createCellStyle(); 41 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 42 // 在于这个居中样式的基础上,添加表格边框样式 43 setBoderStyle(style); 44 // 创建第0个单元格 45 HSSFCell cell = row.createCell(0); 46 // 设置这个单元格的内容为“一” 47 cell.setCellValue("一"); 48 // 设置这个单元格的格式为上面设置好的居中样式+表格边框样式 49 cell.setCellStyle(style); 50 // 同理创建第1个单元格并且设置好样式,下面以此类推 51 cell = row.createCell(1); 52 cell.setCellValue("二"); 53 cell.setCellStyle(style); 54 cell = row.createCell(2); 55 cell.setCellValue("三"); 56 cell.setCellStyle(style); 57 58 // 创建第1行 59 row = sheet.createRow(1); 60 // 清空上面设置好的居中样式+表格边框样式 61 style = workbook.createCellStyle(); 62 // 设置字体样式 63 setFontStyle(workbook, style); 64 cell = row.createCell(0); 65 cell.setCellValue("111"); 66 cell.setCellStyle(style); 67 cell = row.createCell(1); 68 cell.setCellValue("222"); 69 cell.setCellStyle(style); 70 cell = row.createCell(2); 71 cell.setCellValue("333"); 72 cell.setCellStyle(style); 73 // 自动调整列宽 74 allColumnAutoSize(sheet); 75 76 // 将文件存到指定位置 77 try { 78 //false代表覆盖输出 79 FileOutputStream fileOutputStream = new FileOutputStream( 80 "c:/1.xls", false); 81 workbook.write(fileOutputStream); 82 //人走带门 83 fileOutputStream.close(); 84 workbook.close(); 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 89 } 90 其中,涉及到设置边框样式的方法如下: 91 public static void setBoderStyle(HSSFCellStyle style) { 92 style.setBorderTop((short) 6); // 上边框为双线 93 style.setBorderRight((short) 3); // 右边框为虚线 94 style.setBorderBottom((short) 1); // 底边框为单线 95 style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色 96 } 97 设置单元格字体的方法如下: 98 public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) { 99 HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体 100 font.setFontHeightInPoints((short) 16);// 字号 101 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 102 font.setItalic(true);// 斜体 103 font.setColor(HSSFColor.RED.index);// 字体颜色是红色 104 style.setFont(font); // 把这个设置好的字体样色压入样式 105 } 106 自动调整列宽的方法如下: 107 108 public static void allColumnAutoSize(HSSFSheet sheet) { 109 // 遍历所有单元格,把单元格皆设置为最优列宽。 110 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { 111 HSSFRow row = sheet.getRow(i); 112 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { 113 sheet.autoSizeColumn(j); 114 } 115 } 116 } 117 118 119 4.总结 120 121 最后整个Java文件如下,主函数就两个方法,一个EXCEL到JAVA,一个JAVA到EXCEL。实际应用这个插件,创建单元格完全可以利用for与while等循环,从一个ArrayList读取数据,不停地填充单元格。 122 123 package poiExcel; 124 125 //输入输出到文件必备 126 import java.io.*; 127 128 import org.apache.poi.hssf.usermodel.*; 129 import org.apache.poi.hssf.util.*; 130 import org.apache.poi.poifs.filesystem.*; 131 132 public class poiTest { 133 134 public static void ExcelRead() throws Exception { 135 //确定要操作的是c:/1.xls 136 HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem( 137 new FileInputStream("c:/1.xls"))); 138 //取第0个单元表 139 HSSFSheet sheet = workbook.getSheetAt(0); 140 //sheet.getPhysicalNumberOfRows();求出所有行数 141 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { 142 //取一行操作 143 HSSFRow row = sheet.getRow(i); 144 //row.getPhysicalNumberOfCells();求出本行的单元格数,也就是列数 145 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { 146 System.out.print(row.getCell(j) + "\t"); 147 } 148 System.out.println(); 149 } 150 } 151 152 public static void setBoderStyle(HSSFCellStyle style) { 153 style.setBorderTop((short) 6); // 上边框为双线 154 style.setBorderRight((short) 3); // 右边框为虚线 155 style.setBorderBottom((short) 1); // 底边框为单线 156 style.setBottomBorderColor(HSSFColor.RED.index);// 底边框为红色 157 } 158 159 public static void setFontStyle(HSSFWorkbook workbook, HSSFCellStyle style) { 160 HSSFFont font = workbook.createFont();// 要设置字体样式先要创建字体 161 font.setFontHeightInPoints((short) 16);// 字号 162 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 163 font.setItalic(true);// 斜体 164 font.setColor(HSSFColor.RED.index);// 字体颜色是红色 165 style.setFont(font); // 把这个设置好的字体样色压入样式 166 } 167 168 public static void allColumnAutoSize(HSSFSheet sheet) { 169 // 遍历所有单元格,把单元格皆设置为最优列宽。 170 for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { 171 HSSFRow row = sheet.getRow(i); 172 for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) { 173 sheet.autoSizeColumn(j); 174 } 175 } 176 } 177 178 public static void ExcelWrite() { 179 180 // 创建一个webbook,对应一个Excel文件 181 HSSFWorkbook workbook = new HSSFWorkbook(); 182 // 在webbook中添加一个Excel单元表sheet,并设置单元表的问题 183 HSSFSheet sheet = workbook.createSheet("单元表标题"); 184 185 // 在sheet中添加第0行,注意老版本poi对Excel的行数列数是有限制 186 HSSFRow row = sheet.createRow(0); 187 // 创建一个居中样式 188 HSSFCellStyle style = workbook.createCellStyle(); 189 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 190 // 在于这个居中样式的基础上,添加表格边框样式 191 setBoderStyle(style); 192 // 创建第0个单元格 193 HSSFCell cell = row.createCell(0); 194 // 设置这个单元格的内容为“一” 195 cell.setCellValue("一"); 196 // 设置这个单元格的格式为上面设置好的居中样式+表格边框样式 197 cell.setCellStyle(style); 198 // 同理创建第1个单元格并且设置好样式,下面以此类推 199 cell = row.createCell(1); 200 cell.setCellValue("二"); 201 cell.setCellStyle(style); 202 cell = row.createCell(2); 203 cell.setCellValue("三"); 204 cell.setCellStyle(style); 205 206 // 创建第1行 207 row = sheet.createRow(1); 208 // 清空上面设置好的居中样式+表格边框样式 209 style = workbook.createCellStyle(); 210 // 设置字体样式 211 setFontStyle(workbook, style); 212 cell = row.createCell(0); 213 cell.setCellValue("111"); 214 cell.setCellStyle(style); 215 cell = row.createCell(1); 216 cell.setCellValue("222"); 217 cell.setCellStyle(style); 218 cell = row.createCell(2); 219 cell.setCellValue("333"); 220 cell.setCellStyle(style); 221 // 自动调整列宽 222 allColumnAutoSize(sheet); 223 224 // 将文件存到指定位置 225 try { 226 //false代表覆盖输出 227 FileOutputStream fileOutputStream = new FileOutputStream( 228 "c:/1.xls", false); 229 workbook.write(fileOutputStream); 230 //人走带门 231 fileOutputStream.close(); 232 workbook.close(); 233 } catch (Exception e) { 234 e.printStackTrace(); 235 } 236 237 } 238 239 public static void main(String[] args) throws Exception { 240 ExcelRead(); 241 ExcelWrite(); 242 } 243 244 }