Java 制作一个Excel工具类

打印 上一主题 下一主题

主题 1935|帖子 1935|积分 5805

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Excel文件本质就是个zip压缩文件,解压即可获得子文件。相反,压缩子文件后修改后缀名即可获得Excel文件。

XLSX文件主要由以下几个部门组成:
  [Content_Types].xml‌:描述了XLSX文件中所有部件的范例和关系。(焦点文件)
  _rels/.rels‌:包含了工作簿中所有部件之间的关系信息。(焦点文件)
  docProps/app.xml‌:包含文档的属性信息。
  xl/workbook.xml‌:包含了整个工作簿的元数据,如工作表名称、样式等。(焦点文件)
  xl/_rels/workbook.xml.rels‌:包含了工作簿中所有工作表之间的关系信息。(焦点文件)
  xl/worksheets/‌:包含工作簿中每个工作表的XML文件,如sheet1.xml、sheet2.xml等。(焦点文件)
  xl/sharedStrings.xml‌:存储共享字符串数据。
  xl/styles.xml‌:存储单元格样式信息。
  xl/‌media/‌:包含内嵌的媒体文件,如GIF、JPG等
  xl/drawings/‌:媒体文件关系信息,媒体文件的大小位置信息等配置文件
  xl/theme/‌:Office 主题xml文件
没有相干的焦点文件,打开文件时会出现报错。
 
想要本身封装Excel工具类,你必须了解ZipInputStream、ZipOutputStream。
ZipInputStream分析XLSX文件:
  1. package test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.util.zip.ZipEntry;
  8. import java.util.zip.ZipInputStream;
  9. import javax.xml.parsers.DocumentBuilder;
  10. import javax.xml.parsers.DocumentBuilderFactory;
  11. import org.w3c.dom.Document;
  12. import org.w3c.dom.Element;
  13. public class Main {
  14.         public static void main(String[] args) throws IOException {
  15.                 Main main = new Main("C:/Users/June/Desktop/a.xlsx");
  16.                 main.readDocuments();
  17.     }
  18.        
  19.         ZipInputStream zis;
  20.         public Main(String pathname) throws FileNotFoundException {
  21.                 zis = new ZipInputStream(new FileInputStream(new File(pathname)));
  22.         }
  23.        
  24.         public void readDocuments() throws IOException {
  25.                 try {
  26.                         ZipEntry zipEntry;
  27.                         while((zipEntry = zis.getNextEntry())!=null){
  28.                                 String entryName = zipEntry.getName();//每个ZipEntry就是一个文件
  29.                                 if(entryName.startsWith("xl/media")){
  30.                                         readMedia(entryName);
  31.                                 }else{
  32.                                         readDocument(entryName);
  33.                                 }
  34.                         }
  35.                 } finally {
  36.                         if(zis!=null){
  37.                                 zis.close();
  38.                         }
  39.                 }
  40.         }
  41.        
  42.         //处理XML文件
  43.         private void readDocument(String entryName) {
  44.                 Element root = parse(zis);//XML文件根元素
  45.                 //处理逻辑
  46.                
  47.         }
  48.         //处理媒体文件
  49.         private void readMedia(String entryName) {
  50.                
  51.         }
  52.        
  53.         // 1. 创建DOM解析器工厂
  54.     private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  55.     static {
  56.         try {
  57.             // 禁用外部实体(安全防护)
  58.             factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
  59.             factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
  60.             factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
  61.         } catch (Exception ignored) {
  62.         }
  63.     }
  64.     private static Element parse(InputStream is) {
  65.         try {
  66.             // 2. 创建DOM解析器
  67.             DocumentBuilder builder = factory.newDocumentBuilder();
  68.             // 3. 解析XML文件
  69.             Document doc = builder.parse(is);
  70.             // 4. 标准化文档结构
  71.             doc.getDocumentElement().normalize();
  72.             // 5. 获取根元素
  73.             return doc.getDocumentElement();
  74.         } catch (Exception ignored) {
  75.         }
  76.         return null;
  77.     }
  78.    
  79. }
复制代码
 
ZipOutputStream输出XLSX文件:
write输出方法是输出byte[],可以使用String的getBytes()方法。将xml布局的字符串转byte数组输出即可
  1. package test;
  2. import java.io.File;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.util.zip.ZipEntry;
  6. import java.util.zip.ZipOutputStream;
  7. public class Main {
  8.         public static void main(String[] args) throws IOException {
  9.                 Main main = new Main("C:/Users/June/Desktop/a.xlsx");
  10.                 main.write();
  11.     }
  12.        
  13.         ZipOutputStream zos;
  14.         public Main(String pathname) throws IOException {
  15.                 File f = new File(pathname);
  16.                 if(!f.getParentFile().exists()){
  17.                         f.getParentFile().mkdirs();
  18.                 }
  19.                 if(!f.exists()){
  20.                         f.createNewFile();
  21.                 }
  22.                 zos = new ZipOutputStream(new FileOutputStream(f));
  23.         }
  24.        
  25.         public void write() throws IOException {
  26.                 try {
  27.                         zos.putNextEntry(new ZipEntry("_rels/.rels"));
  28.                         //输出.rels文件结构
  29.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  30.                         //.....
  31.                        
  32.                         zos.putNextEntry(new ZipEntry("xl/workbook.xml"));
  33.                         //输出workbook.xml文件结构
  34.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  35.                         //.....
  36.                        
  37.                         zos.putNextEntry(new ZipEntry("xl/sharedStrings.xml"));
  38.                         //输出sharedStrings.xml文件结构
  39.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  40.                         //.....
  41.                        
  42.                         zos.putNextEntry(new ZipEntry("xl/_rels/workbook.xml.rels"));
  43.                         //输出workbook.xml.rels文件结构
  44.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  45.                         //.....
  46.                        
  47.                         zos.putNextEntry(new ZipEntry("xl/styles.xml"));
  48.                         //输出styles.xml文件结构
  49.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  50.                         //.....
  51.                        
  52.                         zos.putNextEntry(new ZipEntry("xl/worksheets/sheet1.xml"));
  53.                         //输出sheet1.xml文件结构
  54.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  55.                         //.....
  56.                        
  57.                         zos.putNextEntry(new ZipEntry("[Content_Types].xml"));
  58.                         //输出[Content_Types].xml文件结构
  59.                         zos.write("<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>".getBytes());
  60.                         //.....
  61.                        
  62.                         zos.flush();
  63.                 } finally {
  64.                         if(zos != null){
  65.                                 zos.closeEntry();
  66.                                 zos.close();
  67.                         }
  68.                 }
  69.         }
  70.    
  71. }
复制代码
 
以下是我本身封装的一个Excel工具类和测试代码。
  1. package test;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5. import java.nio.file.Files;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import june.zero.excel.Excel;
  9. import june.zero.excel.Excel.ExcelStyle;
  10. import june.zero.excel.Excel.ExcelWriter;
  11. import june.zero.excel.xl.Styles.Alignment;
  12. import june.zero.excel.xl.Styles.Borders.Border;
  13. import june.zero.excel.xl.Styles.Fills.Fill;
  14. import june.zero.excel.xl.Styles.Fonts.Font;
  15. import june.zero.excel.xl.worksheets.Worksheet;
  16. import june.zero.excel.xl.worksheets.Worksheet.Cols;
  17. import june.zero.excel.xl.worksheets.Worksheet.MergeCells;
  18. import june.zero.excel.xl.worksheets.Worksheet.SheetData;
  19. import june.zero.excel.xl.worksheets.Worksheet.SheetFormatPr;
  20. public class ExcelTest {
  21.         public static void main(String[] args) throws IOException {
  22.                 File f = new File("C:/Users/June/Desktop/a.xlsx");
  23.                 if(!f.exists()) f.createNewFile();
  24.                 OutputStream os = Files.newOutputStream(f.toPath());
  25.                 ExcelWriter excel = Excel.createExcelWriter(os);
  26.                 Worksheet sheet1 = excel.createWorksheet(null);
  27.                 Cols cols = sheet1.getCols();
  28.                 cols.addCol(1,3,27.0);//1到3列,列宽都是27.0
  29.                
  30.                 MergeCells mergeCells = sheet1.getMergeCells();
  31.                 mergeCells.addMergeCell("B", 4, "C", 5);//合并B4-C5
  32.                
  33.                 SheetFormatPr sheetFormatPr = sheet1.getSheetFormatPr();
  34.                 sheetFormatPr.setDefaultColWidth(9);//默认所有列宽
  35.                 sheetFormatPr.setDefaultRowHeight(90);//默认所有行高
  36.                 SheetData sheet1Data = sheet1.getSheetData();
  37.                 sheet1Data.setValue(0, 0, "111");//第一行第一列的值为111
  38.                 sheet1Data.setRowHeight(0, 72.0);//第一行的行高为72.0
  39.                
  40.                 List<List<String>> dataList = new ArrayList<List<String>>();
  41.                 List<String> r2 = new ArrayList<String>();
  42.                 r2.add("A2");
  43.                 r2.add("B2");
  44.                 r2.add("C2");
  45.                 r2.add("D2");
  46.                 dataList.add(r2);
  47.                 List<String> r3 = new ArrayList<String>();
  48.                 r3.add("A3");
  49.                 r3.add("B3");
  50.                 r3.add("C3");
  51.                 dataList.add(r3);
  52. //                sheet1Data.setValue("A", 2, dataList);//从A2开始赋值
  53.                 sheet1Data.setValue("A2", dataList);//从A2开始赋值
  54.                
  55.                 ExcelStyle cs = new ExcelStyle();
  56.                 Font font = new Font();
  57.                 font.setB(true);//字体粗体
  58.                 font.setSz(13);//字体大小
  59.                 font.setI(true);//字体斜体
  60.                 font.setName("黑体");//字体名称
  61.                 font.setRgb("ed6e19");//字体颜色
  62.                 cs.setFont(font);//字体样式
  63.                 Fill fill = new Fill();//填充
  64.                 fill.setPatternType(Fill.solid);
  65.                 fill.setBgColor("30c7c9");//背景色
  66.                 fill.setFgColor("30c7c9");//前景色
  67.                 cs.setFill(fill);//填充色
  68.                 Border border = new Border();
  69.                 border.setBorder("000000", Border.thin);//黑色实线
  70.                 cs.setBorder(border);//边框
  71.                 Alignment alignment = new Alignment();
  72.                 alignment.setHorizontal(Alignment.center);//水平居中
  73.                 alignment.setVertical(Alignment.center);//垂直居中
  74.                 alignment.setWrapText(true);//自动换行
  75.                 cs.setAlignment(alignment);
  76.                 sheet1Data.setStyle(1, 0, cs);
  77.                 sheet1Data.setStyle(1, 1, cs);
  78.                
  79.                 excel.write();
  80.         }
  81.        
  82. }
复制代码
源码:https://files.cnblogs.com/files/blogs/824473/ZExcel-20250417-src.zip?t=1744885655&download=true
jar包:https://files.cnblogs.com/files/blogs/824473/ZExcel-20250417.zip?t=1744885560&download=true
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表