Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApachePOI:使用合并单元格自动设置大小并使字体粗体_Java_Excel_Apache Poi_Apache Poi 4 - Fatal编程技术网

Java ApachePOI:使用合并单元格自动设置大小并使字体粗体

Java ApachePOI:使用合并单元格自动设置大小并使字体粗体,java,excel,apache-poi,apache-poi-4,Java,Excel,Apache Poi,Apache Poi 4,我是新手,只是在使用ApachePOI生成一个包含一些模拟数据的excel工作表,这是我的课程,我对一些事情感到震惊,有什么最佳实践吗 自动设置行中合并单元格的大小 字体粗体-->用于第一行中的所有单元格 类别: package com.example.TestProject.process; import java.io.File; import java.io.FileOutputStream; import java.util.Map; import java.util.Set; imp

我是新手,只是在使用ApachePOI生成一个包含一些模拟数据的excel工作表,这是我的课程,我对一些事情感到震惊,有什么最佳实践吗

  • 自动设置行中合并单元格的大小
  • 字体粗体-->用于第一行中的所有单元格
  • 类别:

    package com.example.TestProject.process;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    
    public class WriteExcelDemo {
    
        public static void main(
                String[] args) {
    
            // Blank workbook
            XSSFWorkbook workbook = new XSSFWorkbook();
    
            // Create a blank sheet
            XSSFSheet sheet = workbook.createSheet("Employee Data");
    
            // This data needs to be written (Object[])
            Map<String, Object[]> data = new TreeMap<String, Object[]>();
            data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
            data.put("2", new Object[] {1, "Amit", "Shukla"});
            data.put("3", new Object[] {2, "Lokesh", "Gupta"});
            data.put("4", new Object[] {3, "John", "Adwards"});
            data.put("5", new Object[] {4, "Brian", "Schultz"});
    
            // Iterate over data and write to sheet
            Set<String> keyset = data.keySet();
            int rownum = 0;
            for (String key : keyset) {
                Row row = sheet.createRow(rownum++);
                Object[] objArr = data.get(key);
                int cellnum = 0;
                for (Object obj : objArr) {
                    Cell cell = row.createCell(cellnum++);
                    if (obj instanceof String)
                        cell.setCellValue((String) obj);
                    else if (obj instanceof Integer)
                        cell.setCellValue((Integer) obj);
                }
            }
            try {
                // Write the workbook in file system
                FileOutputStream out = new FileOutputStream(new File("howtodoinjava_demo.xlsx"));
                workbook.write(out);
                out.close();
    
                System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    package com.example.TestProject.process;
    导入java.io.File;
    导入java.io.FileOutputStream;
    导入java.util.Map;
    导入java.util.Set;
    导入java.util.TreeMap;
    导入org.apache.poi.ss.usermodel.Cell;
    导入org.apache.poi.ss.usermodel.Row;
    导入org.apache.poi.xssf.usermodel.xssfheet;
    导入org.apache.poi.xssf.usermodel.xssf工作簿;
    公共类WriteExcelDemo{
    公共静态真空总管(
    字符串[]args){
    //空白工作簿
    XSSFWorkbook工作簿=新XSSFWorkbook();
    //创建空白工作表
    XSSFSheet sheet=workbook.createSheet(“员工数据”);
    //需要写入此数据(对象[])
    映射数据=新树映射();
    data.put(“1”,新对象[]{“ID”,“NAME”,“LASTNAME”});
    data.put(“2”,新对象[]{1,“Amit”,“Shukla”});
    data.put(“3”,新对象[]{2,“Lokesh”,“Gupta”});
    data.put(“4”,新对象[]{3,“John”,“Adwards”});
    data.put(“5”,新对象[]{4,“Brian”,“Schultz”});
    //迭代数据并写入工作表
    Set keyset=data.keyset();
    int rownum=0;
    用于(字符串键:键集){
    Row-Row=sheet.createRow(rownum++);
    Object[]objArr=data.get(key);
    int-cellnum=0;
    用于(对象对象对象:对象对象对象){
    Cell Cell=row.createCell(cellnum++);
    if(字符串的obj实例)
    cell.setCellValue((字符串)obj);
    else if(obj instanceof Integer)
    cell.setCellValue((整数)obj);
    }
    }
    试一试{
    //在文件系统中编写工作簿
    FileOutputStream out=新的FileOutputStream(新文件(“howtodoinjava_demo.xlsx”);
    练习册。写(出);
    out.close();
    System.out.println(“howtodoinjava_demo.xlsx已成功写入磁盘”);
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    

    }

    对于自动调整大小的列,有。在那里,您可以指定合并单元格的内容应被考虑还是忽略。默认设置为忽略合并的单元格。但您的问题在这一点上并不十分清楚,因为您的代码根本不合并单元格

    对于行样式,有<代码>Excel在将新单元格添加到此行时采用该样式。但是apachepoi的行为不是这样的。对于新创建的单元,它始终使用默认的单元样式。因此,我们需要一个方法
    CellStyle getPreferredCellStyle(Cell Cell Cell)
    ,它可以像
    Excel
    那样获取给定单元格的首选单元格样式

    而且,由于您询问的是最佳实践,请尽可能使用
    org.apache.poi.ss.usermodel.*
    。因此,代码能够处理
    HSSF
    XSSF
    而无需太多更改

    例如:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    
    public class WriteExcelDemo {
    
     static CellStyle getPreferredCellStyle(Cell cell) {
      // a method to get the preferred cell style for a cell
      // this is either the already applied cell style
      // or if that not present, then the row style (default cell style for this row)
      // or if that not present, then the column style (default cell style for this column)
      CellStyle cellStyle = cell.getCellStyle();
      // if no explicit cell style applied then cellStyle.getIndex() is 0 for XSSF
      // or 15 (0xF = the index to the default ExtendedFormatRecord (0xF)) for HSSF
      if ((cell instanceof XSSFCell && cellStyle.getIndex() == 0) || (cell instanceof HSSFCell && cellStyle.getIndex() == 15)) cellStyle = cell.getRow().getRowStyle();
      if (cellStyle == null) cellStyle = cell.getSheet().getColumnStyle(cell.getColumnIndex());
      if (cellStyle == null) cellStyle = cell.getCellStyle();
      return cellStyle;
     }
    
     public static void main(String[] args) throws Exception {
    
      // Blank workbook XSSF or HSSF
      Workbook workbook = new XSSFWorkbook();
      //Workbook workbook = new HSSFWorkbook();
    
      // Create needed cell styles on workbook level
      Font boldFont = workbook.createFont();
      boldFont.setBold(true);
      CellStyle headerRowStyle = workbook.createCellStyle();
      headerRowStyle.setFont(boldFont);
    
    
      // This data needs to be written (Object[])
      Map<String, Object[]> data = new TreeMap<String, Object[]>();
      data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
      data.put("2", new Object[] {1, "Amit", "Shukla"});
      data.put("3", new Object[] {2, "Lokesh", "Gupta"});
      data.put("4", new Object[] {3, "John", "Adwards"});
      data.put("5", new Object[] {4, "Brian", "Schultz"});
    
      // Create a blank sheet
      Sheet sheet = workbook.createSheet("Employee Data");
    
      // Iterate over data and write to sheet
      Set<String> keyset = data.keySet();
      int rownum = 0;
      for (String key : keyset) {
       Row row = sheet.createRow(rownum++);
       if (rownum == 1) row.setRowStyle(headerRowStyle); // row style for first row; Excel takes that style when new cells are added to this row
       Object[] objArr = data.get(key);
       int cellnum = 0;
       for (Object obj : objArr) {
        Cell cell = row.createCell(cellnum++);
        cell.setCellStyle(getPreferredCellStyle(cell)); // set the preferred cell style for the new cell as Excel would do
        if (obj instanceof String)
         cell.setCellValue((String) obj);
        else if (obj instanceof Integer)
         cell.setCellValue((Integer) obj);
       }
      }
    
      for (int c = 0; c < data.get("1").length; c++) {
       //sheet.autoSizeColumn(c); // autosize, merged cells should be ignored
       sheet.autoSizeColumn(c, true); // autosize, merged cells should be considered
      }
    
      // Write the workbook in file system
      String filepath = (workbook instanceof XSSFWorkbook)?"./howtodoinjava_demo.xlsx":"./howtodoinjava_demo.xls";
      FileOutputStream out = new FileOutputStream(new File(filepath));
      workbook.write(out);
      out.close();
      workbook.close();
    
      System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");
     }
    }
    
    导入java.io.File;
    导入java.io.FileOutputStream;
    导入java.util.Map;
    导入java.util.Set;
    导入java.util.TreeMap;
    导入org.apache.poi.ss.usermodel.*;
    导入org.apache.poi.xssf.usermodel.xssf工作簿;
    导入org.apache.poi.xssf.usermodel.XSSFCell;
    导入org.apache.poi.hssf.usermodel.HSSFWorkbook;
    导入org.apache.poi.hssf.usermodel.HSSFCell;
    公共类WriteExcelDemo{
    静态单元格样式getPreferredCellStyle(单元格){
    //获取单元格首选单元格样式的方法
    //这是已应用的单元样式
    //或者,如果不存在,则为行样式(此行的默认单元格样式)
    //或者,如果不存在,则为列样式(此列的默认单元格样式)
    CellStyle CellStyle=cell.getCellStyle();
    //如果未应用显式单元格样式,则cellStyle.getIndex()对于XSSF为0
    //或HSSF的15(0xF=默认ExtendedFormatRecord(0xF)的索引)
    如果((XSSFCell的单元格实例和&cellStyle.getIndex()=0)| |(HSSFCell的单元格实例和&cellStyle.getIndex()=15))cellStyle=cell.getRow().getRowStyle();
    如果(cellStyle==null)cellStyle=cell.getSheet().getColumnStyle(cell.getColumnIndex());
    如果(cellStyle==null)cellStyle=cell.getCellStyle();
    返回单元格样式;
    }
    公共静态void main(字符串[]args)引发异常{
    //空白工作簿XSSF或HSSF
    工作簿=新的XSSF工作簿();
    //工作簿=新的HSSF工作簿();
    //在工作簿级别创建所需的单元格样式
    Font boldFont=工作簿.createFont();
    boldFont.setBold(true);
    CellStyle headerRowStyle=workbook.createCellStyle();
    headerRowStyle.setFont(粗体字体);
    //需要写入此数据(对象[])
    映射数据=新树映射();
    data.put(“1”,新对象[]{“ID”,“NAME”,“LASTNAME”});
    data.put(“2”,新对象[]{1,“Amit”,“Shukla”});
    data.put(“3”,新对象[]{2,“Lokesh”,“Gupta”});
    data.put(“4”,新对象[]{3,“John”,“Adwards”});
    data.put(“5”,新对象[]{4,“Brian”,“Schultz”});
    //创建空白工作表
    工作表=工作簿.createSheet(“员工数据”);
    //迭代数据并写入工作表
    Set keyset=data.keyset();
    int rownum=0;
    用于(字符串键:键集){
    Row-Row=sheet.createRow(rownum++);
    if(rownum==1)row.setRowStyle(headerRowStyle);//第一行的行样式;向此行添加新单元格时,Excel采用该样式
    Object[]objArr=data.get(key);
    int-cellnum=0;
    用于(对象对象对象:对象对象对象){
    Cell Cell=row.createCell(cellnum++);
    cell.setCellStyle(getPreferredCellStyle(cell));//像Excel那样为新单元格设置首选单元格样式
    if(字符串的obj实例)
    cell.setCellValue((字符串)obj);
    else if(obj instanceof Integer)