POI Excel 基础(一)

2023-11-14

POI 5.2.3
官网

github

POI-HSSF and POI-XSSF/SXSSF 用于访问Microsoft Excel格式文件的Java API

HSSF:是Horrible SpreadSheet Format的缩写,也即“可怕的电子表格格式”

    是操作Excel97-2003版本,扩展名为.xls。

XSSF:

    是操作Excel2007版本开始,扩展名为.xlsx。

SXSSF:

    是在XSSF基础上,POI3.8版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。

Excel不同版本的一些区别如下,这些限制其实间接的局限了POI提供的API功能。

1、支持的行数、列数

    Excel97-2003版本,一个sheet最大行数65536,最大列数256。

    Excel2007版本开始,一个sheet最大行数1048576,最大列数16384。

2、文件大小

    .xlsx文件比.xls的压缩率高,也就是相同数据量下,.xlsx的文件会小很多。

3、兼容性

    Excel97-2003版本是不能打开.xlsx文件的。

    Excel2007开始的版本是可以打开.xls文件的。

概述

HSSF是POI项目对Excel '97(-2007)文件格式的纯Java实现。XSSF是POI项目对Excel 2007 OOXML (.xlsx)文件格式的纯Java实现。

HSSF和XSSF提供了读取电子表格、创建、修改、读取和编写XLS电子表格的方法。他们提供:

  • 为有特殊需要而设的低阶结构
  • 用于高效只读访问的事件模型API(eventmodel api
  • 用于创建、读取和修改XLS文件的完整用户模型api

对于从纯HSSF用户模型转换为希望使用联合SS用户模型来支持HSSF和XSSF的人,请参阅SS用户模型转换指南

生成电子表格的另一种方法是通过Cocoon序列化器(但您仍将间接使用HSSF)。使用Cocoon,您可以通过简单地应用样式表和指定序列化器来序列化任何XML数据源(例如,它可能是用SQL输出的ESQL页面)。

如果您只是读取电子表格数据,那么根据您的文件格式,使用org.apache.poi.hssf.eventusermodel包或org.apache.poi.xssf.eventusermodel包中 eventmodel api。

如果要修改电子表格数据,则使用usermodel api。您也可以通过这种方式生成电子表格。

请注意,usermodel系统的内存占用比底层的eventmodel系统要高,但其主要优点是使用起来要简单得多。另外请注意,由于新的XSSF支持的Excel 2007 OOXML (.xlsx)文件是基于XML的,处理它们的内存占用比旧的HSSF支持的二进制文件(.xls)要高。

SXSSF (Since POI 3.8 beta3)

从3.8-beta3开始,POI提供了构建在XSSF之上的低内存占用的SXSSF API。

SXSSF是XSSF的api兼容流扩展,用于必须生成非常大的电子表格,并且堆空间有限的情况。SXSSF通过限制对滑动窗口内的行的访问来实现低内存占用,而XSSF允许访问文档中的所有行。不再在窗口中的旧行在被写入磁盘时变得不可访问。

在自动刷新模式下,可以指定访问窗口的大小,以便在内存中保存一定数量的行。当达到该值时,创建额外的行将导致从访问窗口中删除具有最低索引的行并将其写入磁盘。或者,窗口大小可以设置为动态增长;它可以根据需要通过显式调用flushRows(int keepRows)来定期修剪。

由于实现的流性质,与XSSF相比有以下限制:

  • 在一个时间点上只能访问有限数量的行。
  • 不支持Sheet.clone()
  • 不支持公式计算

更多细节请参见SXSSF How-To

下表概述了POI的电子表格API的比较特点:

在这里插入图片描述

1、开发人员HSSF和XSSF功能指南

想要使用HSSF和XSSF读写电子表格?这份指南是给你的。如果您想要更深入地了解HSSF和XSSF用户api,请参阅HOWTO指南,因为它包含了如何使用这些东西的实际描述。

1.1 新建 Workbook(工作簿)

Workbook wb = new XSSFWorkbook();
...
try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {
    wb.write(fileOut);
}

1.2 新建 Sheet

Workbook wb = new HSSFWorkbook();  // or new XSSFWorkbook();
Sheet sheet1 = wb.createSheet("new sheet");
Sheet sheet2 = wb.createSheet("second sheet");
// Note that sheet name is Excel must not exceed 31 characters
// and must not contain any of the any of the following characters:
// 0x0000
// 0x0003
// colon (:)
// backslash (\)
// asterisk (*)
// question mark (?)
// forward slash (/)
// opening square bracket ([)
// closing square bracket (])
// You can use org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}
// for a safe way to create valid names, this utility replaces invalid characters with a space (' ')
String safeName = WorkbookUtil.createSafeSheetName("[O'Brien's sales*?]"); // returns " O'Brien's sales   "
Sheet sheet3 = wb.createSheet(safeName);
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}

1.3 创建单元格

Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");

// Create a row and put some cells in it.
// 行和单元格都是从0开始。
Row row = sheet.createRow(0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(
     createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}

1.4 创建日期单元格

Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow(0);
// Create a cell and put a date value in it.  The first cell is not styled as a date.
Cell cell = row.createCell(0);
cell.setCellValue(new Date());

// we style the second cell as a date (and time).  It is important to
// create a new cell style from the workbook otherwise you can end up
// modifying the built in style and effecting not only this cell but other cells.
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(
	    createHelper.createDataFormat().getFormat("m/d/yy h:mm"));
cell = row.createCell(1);
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle);

//you can also set date as java.util.Calendar
cell = row.createCell(2);
cell.setCellValue(Calendar.getInstance());
cell.setCellStyle(cellStyle);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}

1.5 处理不同类型的单元格

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow(2);
row.createCell(0).setCellValue(1.1);
row.createCell(1).setCellValue(new Date());
row.createCell(2).setCellValue(Calendar.getInstance());
row.createCell(3).setCellValue("a string");
row.createCell(4).setCellValue(true);
row.createCell(5).setCellType(CellType.ERROR);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}

1.6 Files vs InputStreams

当打开工作簿时,无论是.xls HSSFWorkbook还是.xlsx XSSFWorkbook,工作簿都可以从FileInputStream加载。使用File对象允许更低的内存消耗,而InputStream需要更多的内存,因为它必须缓冲整个文件。

如果使用WorkbookFactory,很容易使用其中一个:

// Use a file
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
// Use an InputStream, needs more memory
Workbook wb = WorkbookFactory.create(new FileInputStream("MyExcel.xlsx"));

如果直接使用HSSFWorkbookXSSFWorkbook,您通常应该通过POIFSFileSystemOPCPackage,以完全控制生命周期(包括完成时关闭文件):

// HSSFWorkbook, File
POIFSFileSystem fs = new POIFSFileSystem(new File("file.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
....
fs.close();
// HSSFWorkbook, InputStream, needs more memory
POIFSFileSystem fs = new POIFSFileSystem(myInputStream);
HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
// XSSFWorkbook, File
OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();
// XSSFWorkbook, InputStream, needs more memory
OPCPackage pkg = OPCPackage.open(myInputStream);
XSSFWorkbook wb = new XSSFWorkbook(pkg);
....
pkg.close();

1.7 演示各种对齐选项

public static void main(String[] args) throws Exception {
    Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();
    Sheet sheet = wb.createSheet();
    Row row = sheet.createRow(2);
    
    // 设置行高使用HSSFRow对象的setHeight和setHeightInPoints方法,
	// 这两个方法的区别在于setHeightInPoints的单位是点,而setHeight的单位是1/20个点
    row.setHeightInPoints(30);
    createCell(wb, row, 0, HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
    createCell(wb, row, 1, HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.BOTTOM);
    createCell(wb, row, 2, HorizontalAlignment.FILL, VerticalAlignment.CENTER);
    createCell(wb, row, 3, HorizontalAlignment.GENERAL, VerticalAlignment.CENTER);
    createCell(wb, row, 4, HorizontalAlignment.JUSTIFY, VerticalAlignment.JUSTIFY);
    createCell(wb, row, 5, HorizontalAlignment.LEFT, VerticalAlignment.TOP);
    createCell(wb, row, 6, HorizontalAlignment.RIGHT, VerticalAlignment.TOP);
    // Write the output to a file
    try (OutputStream fileOut = new FileOutputStream("xssf-align.xlsx")) {
        wb.write(fileOut);
    }
    wb.close();
}
/**
 * Creates a cell and aligns it a certain way.
 *
 * @param wb     the workbook
 * @param row    the row to create the cell in
 * @param column the column number to create the cell in
 * @param halign the horizontal alignment for the cell.
 * @param valign the vertical alignment for the cell.
 */
private static void createCell(Workbook wb, Row row, int column, HorizontalAlignment halign, VerticalAlignment valign) {
    Cell cell = row.createCell(column);
    cell.setCellValue("Align It");
    CellStyle cellStyle = wb.createCellStyle();
    cellStyle.setAlignment(halign);
    cellStyle.setVerticalAlignment(valign);
    cell.setCellStyle(cellStyle);
}

1.8 使用边框

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow(1);
// Create a cell and put a value in it.
Cell cell = row.createCell(1);
cell.setCellValue(4);
// Style the cell with borders all around.
CellStyle style = wb.createCellStyle();
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.GREEN.getIndex());
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLUE.getIndex());
style.setBorderTop(BorderStyle.MEDIUM_DASHED);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
cell.setCellStyle(style);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

1.9 遍历行和单元格

有时,您希望只遍历工作簿中的所有工作表、工作表中的所有行或一行中的所有单元格。这可以通过一个简单的for循环实现。

这些迭代器可以通过调用workbook.sheetIterator(), sheet.rowIterator(), 和 row.cellIterator(),来获得,或者隐式地使用for-each循环。注意,rowIteratorcellIterator遍历已创建的行或单元格,跳过空行和单元格。

for (Sheet sheet : wb ) {
    for (Row row : sheet) {
        for (Cell cell : row) {
            // Do something here
        }
    }
}

1.10 迭代单元格,控制缺失/空白单元格(missing / blank cells)

在某些情况下,在迭代时,需要完全控制如何处理缺失或空白的行和单元格,并且需要确保访问每个单元格,而不仅仅是文件中定义的那些单元格。(CellIterator将只返回在文件中定义的单元格,这主要是那些有值或样式,但它取决于Excel)。

在这种情况下,您应该获取一行的第一列和最后一列信息,然后调用getCell(int, MissingCellPolicy)来获取单元格。使用MissingCellPolicy来控制如何处理空白或空单元格。


// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());
for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
   Row r = sheet.getRow(rowNum);
   if (r == null) {
      // This whole row is empty
      // Handle it as needed
      continue;
   }
   int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);
   for (int cn = 0; cn < lastColumn; cn++) {
      Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
      if (c == null) {
         // The spreadsheet is empty in this cell
      } else {
         // Do something useful with the cell's contents
      }
   }
}

1.11 获取单元格内容

要获取单元格的内容,首先需要知道它是什么类型的单元格(例如,向字符串单元格请求其数字内容将得到NumberFormatException)。你会想要 switch 单元格的类型,然后为那个单元格调用适当的getter。

在下面的代码中,我们循环遍历一个工作表中的每个单元格,打印出单元格的引用(例如A3),然后打印出单元格的内容。

// import org.apache.poi.ss.usermodel.*;
DataFormatter formatter = new DataFormatter();
Sheet sheet1 = wb.getSheetAt(0);
for (Row row : sheet1) {
    for (Cell cell : row) {
        CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
        System.out.print(cellRef.formatAsString());
        System.out.print(" - ");
        // get the text that appears in the cell by getting the cell value and applying any data formats (Date, 0.00, 1.23e9, $1.23, etc)
        String text = formatter.formatCellValue(cell);
        System.out.println(text);
        // Alternatively, get the value and format it yourself
        switch (cell.getCellType()) {
            case CellType.STRING:
                System.out.println(cell.getRichStringCellValue().getString());
                break;
            case CellType.NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.println(cell.getDateCellValue());
                } else {
                    System.out.println(cell.getNumericCellValue());
                }
                break;
            case CellType.BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case CellType.FORMULA:
                System.out.println(cell.getCellFormula());
                break;
            case CellType.BLANK:
                System.out.println();
                break;
            default:
                System.out.println();
        }
    }
}

1.12 文本提取

对于大多数文本提取需求,标准的ExcelExtractor类应该提供您所需要的一切。

try (InputStream inp = new FileInputStream("workbook.xls")) {
    HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));
    ExcelExtractor extractor = new ExcelExtractor(wb);
    extractor.setFormulasNotResults(true);
    extractor.setIncludeSheetNames(false);
    String text = extractor.getText();
    wb.close();
}

对于非常花哨的文本提取,XLS到CSV等,请查看/poi-examples/src/main/java/org/apache/poi/examples/hssf/eventusermodel/XLS2CSVmra.java

1.13 填充和颜色

Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow(1);
// Aqua background
CellStyle style = wb.createCellStyle();
style.setFillBackgroundColor(IndexedColors.AQUA.getIndex());
style.setFillPattern(FillPatternType.BIG_SPOTS);
Cell cell = row.createCell(1);
cell.setCellValue("X");
cell.setCellStyle(style);
// Orange "foreground", foreground being the fill foreground not the font color.
style = wb.createCellStyle();
style.setFillForegroundColor(IndexedColors.ORANGE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell = row.createCell(2);
cell.setCellValue("X");
cell.setCellStyle(style);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

1.14 合并单元格(Merging cells)

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("This is a test of merging");
sheet.addMergedRegion(new CellRangeAddress(
        1, //first row (0-based)
        1, //last row  (0-based)
        1, //first column (0-based)
        2  //last column  (0-based)
));
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

1.15 使用字体

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow(1);
// Create a new font and alter it.
Font font = wb.createFont();
font.setFontHeightInPoints((short)24);
font.setFontName("Courier New");
font.setItalic(true);
font.setStrikeout(true);
// Fonts are set into a style so create a new one to use.
CellStyle style = wb.createCellStyle();
style.setFont(font);
// Create a cell and put a value in it.
Cell cell = row.createCell(1);
cell.setCellValue("This is a test of fonts");
cell.setCellStyle(style);
// Write the output to a file
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

注意,工作簿中唯一字体的最大数量限制为32767。您应该在应用程序中重用字体,而不是为每个单元格创建字体。例子:
Wrong:

for (int i = 0; i < 10000; i++) {
    Row row = sheet.createRow(i);
    Cell cell = row.createCell(0);
    CellStyle style = workbook.createCellStyle();
    Font font = workbook.createFont();
    font.setBoldweight(Font.BOLDWEIGHT_BOLD);
    style.setFont(font);
    cell.setCellStyle(style);
}

Correct:

CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setFont(font);
for (int i = 0; i < 10000; i++) {
    Row row = sheet.createRow(i);
    Cell cell = row.createCell(0);
    cell.setCellStyle(style);
}

1.16 自定义颜色

XSSF:

XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell( 0);
cell.setCellValue("custom XSSF colors");
XSSFCellStyle style1 = wb.createCellStyle();
style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128), new DefaultIndexedColorMap()));
style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);

1.17 读取和重写工作薄

try (InputStream inp = new FileInputStream("workbook.xls")) {
//InputStream inp = new FileInputStream("workbook.xlsx");
    Workbook wb = WorkbookFactory.create(inp);
    Sheet sheet = wb.getSheetAt(0);
    Row row = sheet.getRow(2);
    Cell cell = row.getCell(3);
    if (cell == null)
        cell = row.createCell(3);
    cell.setCellType(CellType.STRING);
    cell.setCellValue("a test");
    // Write the output to a file
    try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
        wb.write(fileOut);
    }
}

1.18 在单元格中使用换行

Workbook wb = new XSSFWorkbook();   //or new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(2);
Cell cell = row.createCell(2);
cell.setCellValue("Use \n with word wrap on to create a new line");
//to enable newlines you need set a cell styles with wrap=true
CellStyle cs = wb.createCellStyle();
cs.setWrapText(true);
cell.setCellStyle(cs);
//increase row height to accommodate two lines of text
row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));
//adjust column width to fit the content
sheet.autoSizeColumn(2);
try (OutputStream fileOut = new FileOutputStream("ooxml-newlines.xlsx")) {
    wb.write(fileOut);
}
wb.close();

1.19 数据格式化‘

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("format sheet");
CellStyle style;
DataFormat format = wb.createDataFormat();
Row row;
Cell cell;
int rowNum = 0;
int colNum = 0;
row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(11111.25);
style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.0"));
cell.setCellStyle(style);
row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(11111.25);
style = wb.createCellStyle();
style.setDataFormat(format.getFormat("#,##0.0000"));
cell.setCellStyle(style);
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

1.20 Fit Sheet to One Page

Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("format sheet");
PrintSetup ps = sheet.getPrintSetup();
sheet.setAutobreaks(true);
ps.setFitHeight((short)1);
ps.setFitWidth((short)1);
// Create various cells and rows for spreadsheet.
try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {
    wb.write(fileOut);
}
wb.close();

Images

图像是绘图支持的一部分。要添加图像,只需在绘图父元素(DrawingPatriarch)上调用createPicture()。在撰写本文时,支持以下类型:

  • PNG
  • JPG
  • DIB

应该注意的是,一旦将图像添加到工作表中,任何现有的绘图都可能被擦除。

//create a new workbook
Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();
//add picture data to this workbook.
InputStream is = new FileInputStream("image1.jpeg");
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
is.close();
CreationHelper helper = wb.getCreationHelper();
//create sheet
Sheet sheet = wb.createSheet();
// Create the drawing patriarch.  This is the top level container for all shapes.
Drawing drawing = sheet.createDrawingPatriarch();
//add a picture shape
ClientAnchor anchor = helper.createClientAnchor();
//set top-left corner of the picture,
//subsequent call of Picture#resize() will operate relative to it
anchor.setCol1(3);
anchor.setRow1(2);
Picture pict = drawing.createPicture(anchor, pictureIdx);
//auto-size picture relative to its top-left corner
pict.resize();
//save workbook
String file = "picture.xls";
if(wb instanceof XSSFWorkbook) file += "x";
try (OutputStream fileOut = new FileOutputStream(file)) {
    wb.write(fileOut);
}

Picture.resize()仅适用于JPEG和PNG。目前还不支持其他格式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

POI Excel 基础(一) 的相关文章

  • 复制列中的所有单元格[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一张表 有 200 行 行间有一
  • 拆分具有多行文本和单行文本的行

    我试图弄清楚如何拆分数据行 其中行中的 B C D 列包含多行 而其他列不包含多行 我已经弄清楚如何拆分多行单元格 如果我将这些列复制到新工作表中 手动插入行 然后运行下面的宏 仅适用于 A 列 但我在编码时迷失了休息 Here s wha
  • 强力查询历年产品利润对比

    我有一个数据集 其中包含公司 产品 利润和年份 公司每年都会销售少量产品并获得利润 公司没有必要在明年销售相同的产品 他们可能会省略以前的产品并添加新的少量产品 我只想对两年的产品进行逐个比较 如下所示 我的数据集是 Company Pro
  • 是否有非 VBA Excel 溢出公式来创建和处理数组数组?

    我在 Excel 365 中有一张工作表 其中包含 A 列和 B 列 如下所示 我想使用一些公式 不是 VBA 获取 C 列和 D 列 也就是说 我想重复每一个Title for Count次并为其添加一个流水号 A B C D 1 Tit
  • 实体框架、dll、excel

    我用C 编写了Excel使用的dll 该dll是COM注册的 我与 Excel 的连接没有问题 该 dll 使用实体框架 5 从 SQL Server 数据库检索数据 如果我通过控制台应用程序运行该 dll 则该 dll 工作正常 但是当我
  • 使用 MemoryStream 创建 Open XML 电子表格时的 Excel 和“不可读内容”

    使用 Open XML SDK v2 0 创建 Excel 电子表格时 我们的 Excel 输出最初可以成功运行几个月 最近Excel 所有版本 开始抱怨 Excel在 zot xlsx 中发现不可读的内容 是否要恢复此工作簿的内容 我们正
  • Excel 工作表到 iPhone 数据 -- A 点到 B 点

    尽可能简单 我有一个非常简单的 Excel 电子表格 只有 1000 多条记录 我想将其用作 iPhone 应用程序的静态数据源 最好的进攻计划是什么 我心中的可能性 1 直接读取XLS作为数据源 是否有Obj C库用于此 2 将XLS 转
  • 基于多个动态过滤条件过滤Excel范围

    我想过滤数据集 考虑几个可以根据可能值列表动态更改的过滤条件 我有过滤条件team其具有以下值 Team A Team B ALL 其中 ALL 是代表所有团队的通配符 对于第二个标准release 如果我想在过滤器中包含多个版本 则值之间
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 标准 VBA 函数“找不到项目或库”

    因此 我必须在我的 PC 上运行别人的 Excel 应用程序 并且在标准函数 如日期 格式 十六进制 中间等 上收到 找不到项目或库 的信息 一些研究表明 如果我在这些函数前加上 VBA 前缀 如 VBA Date 中那样 它会正常工作 网
  • Confluence:使用 VBA 更新现有页面

    我尝试使用 VBA 更新 Confluence 页面 我的想法是使用REST API加载页面内容 修改内容然后上传修改后的版本 这是我的代码 Private Sub TestRESTApi Dim uname As String uname
  • 证明 Excel VBA Scripting.Dictionary 不保留项目插入顺序

    我正在尝试决定是否为我的项目使用 Excel VBA 集合或字典 出于多种原因 我倾向于字典 但在使用字典时我会继续阅读它For Each循环检索字典项目或从字典 Items 数组读取项目时 检索顺序可能不是添加项目的顺序 这对于我的应用程
  • 复制一张工作表上的静态范围,然后根据单元格中的单个值粘贴到另一张工作表中的动态范围

    我对这个问题分为三个部分 我在 Sheet1 A1 中有一个带有周数的单元格 我在 Sheet1 B1 F1 中有一个需要复制的静态范围 然后 我需要将该值粘贴到 Sheet2 中的动态范围中 偏移量为行的周数 这是我正在为我经常使用的工作
  • 使用 Apache POI Excel 写入特定单元格位置

    如果我有一个未排序的参数 x y z 列表 是否有一种简单的方法将它们写入使用 POI 创建的 Excel 文档中的特定单元格 就好像前两个参数是 X 和Y 坐标 例如 我有如下行 10 4 100 是否可以在第 10 行第 4 列的单元格
  • 在Google电子表格中划分整列

    我是 Google 电子表格的一个相对较新的用户 我希望 B 列中的每个单元格都是 A 列 同一行 中内容除以 5 的结果 B1 B2 B3 等 商 应为 A1 A2 A3 等 被除数 除以 5 除数 在示例中 B1 A1 5 我知道一项一
  • 无法摆脱脚本中的硬编码延迟

    我用 vba 结合 selenium 编写了一个脚本来解析网页中可用的所有公司名称 该网页启用了延迟加载方法 因此每个滚动中只有 20 个链接可见 如果我滚动 2 次 则可见链接数为 40 个 依此类推 该网页中有 1000 个可用链接 我
  • 在 VBA Excel 中查找、剪切和插入行以匹配借项和贷项值

    我在 Sheet1 中有以下设置数据 并从第 4 行 A 列开始 其中标题位于第 3 行 No Date Code Name Remarks D e b i t Cr e d i t 1 4 30 2015 004 AB 01 04 15
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • SpreadsheetML 文件扩展名被 IE 和 FF 更改 - 内容类型错误?

    我正在 PHP 中生成 SpreadsheetML 文件 当用户下载文件并保存时 默认情况下文件会另存为 Report xml 并在 Excel 中打开 但是 如果选择在 Excel 中打开文件而不是保存文件 则文件名将更改为 Report
  • Java Microsoft Excel API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • 基于协同过滤算法实现选课推荐系统

    新版本教务管理系统 教务管理系统 选课功能 1 系统功能 1 用户账户管理 2 学生个人信息的查看与修改 3 学生的网上选课与课程的评分 4 教师个人信息的查看与修改 5 教师对学生课程评价结果的查看 6 管理员对学生信息与教师信息的查看与
  • 前端绘制地铁路线图

    前端绘制地铁路线图 前端可以使用多种技术绘制二维地图 以下是几种常见的方法 SVG SVG是一种基于XML的矢量图形格式 可以使用SVG元素绘制各种形状和路径 包括线 圆 多边形等 可以使用JavaScript库如D3 js来绘制SVG地图
  • 【推荐系统】{1} —— 基于用户的协同过滤算法

    协同过滤 英语 Collaborative Filtering 简称CF 简单来说是利用某兴趣相投 拥有共同经验之群体的喜好来推荐用户感兴趣的信息 个人透过合作的机制给予信息相当程度的回应 如评分 并记录下来以达到过滤的目的进而帮助别人筛选
  • 【Pytorch】Inplace operation(待完善)

    什么是Inplace操作 本质上讲 inplace操作是指将新值赋到原变量地址上的操作 目的是节约内存空间 例如inplace操作 x 1 假设原x值为0 储存在id为139973228650216的内存地址中 在进行该inplace操作后
  • 【LeetCode每日刷题】一单词长度的最大乘积

    一 题目 给定一个字符串数组 words 请计算当两个字符串 words i 和 words j 不包含相同字符时 它们长度的乘积的最大值 假设字符串中只包含英语的小写字母 如果没有不包含相同字符的一对字符串 返回 0 输入输出样例 示例1
  • LVS、Nginx、HAProxy、keepalive 的工作原理详解

    当前大多数的互联网系统都使用了服务器集群技术 集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务 这些集群可以是 Web 应用服务器集群 也可以是数据库服务器集群 还可以是分布式缓存服务器集群等等 在实际应用中 在 Web 服务
  • 阿里云ACK(容器服务)+ElasticWorkload弹性负载+HPA弹性伸缩实践

    背景 阿里云ACK kubernetes容器服务 高弹性 高稳定性 低成本解决方案 通过将ECI服务以虚拟节点的方式接入ACK容器集群 将集群中pod应用的固定量调度到现有的ACK容器服务的ECS node节点上 将集群中pod应用的弹性量
  • 测试用例要如何写

    1 测试点与测试用例 测试点不等于测试用例 这是我们首先需要认识到的 问题1 这些测试点在内容上有重复 存在冗余 问题2 一些测试点的测试输入不明确 不知道测试时要测试哪些 问题3 总是在搭相似的环境 做类似的操作 问题4 测试点描述得太粗
  • CWnd和HWND的区别

    所有控件类都是CWnd类的派生类 CWnd的所有成员函数在控件类中都可以使用 在MFC中 CWnd类是一个很重要的类 它封装了Windows的窗口句柄HWND 在Windows编程中 每一个窗口都是有窗口句柄标识的 但是 类CWnd的对象和
  • 基于ResNet50算法实现图像分类识别

    概要 在本文中将介绍使用Python语言 基于TensorFlow搭建ResNet50卷积神经网络对四种动物图像数据集进行训练 观察其模型训练效果 一 目录 ResNet50介绍 图片模型训练预测 项目扩展 二 ResNet50介绍 Res
  • 2020年第一碗鸡汤

    2020年第一碗鸡汤 2020年第一天 新的一年如何生活 对照下这40条 看看那些有益 关于 如何生活 英国作家马特 海格给出的40条建议 01 快乐出现的时候 享受快乐 02 小口慢饮 别狼吞虎咽 03 对自己温柔些 少工作 多休息 04
  • 计算机音乐怎么把音乐放u盘,怎么把音乐拷贝到u盘

    语音内容 大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 把音乐拷贝到u盘的方法如下 1 首先在电脑上插入u盘 2 然后打开 我的电脑 或者 计算机 找到U盘 点击打开 3 同时找到装有音乐的文件夹 长按鼠标 在弹出的选
  • 2021.11.16-17总结

    数据结构串 串是由字符组成的有序数列 相等要字符长度相等并且每一个字符相等 顺序串 非紧缩格式 每个单元一个字符 紧缩格式 每个单元多个字符 链串 每个节点存放的字符数称为节点大小 串的匹配模式 BF算法 KMP算法 KMP算法避免了主串指
  • python混合线性模型_Python Statsmodels Mixedlm(混合线性模型)随机效应

    我对Statsmodels Mixedlm的输出感到有点困惑 我希望有人可以解释一下 我有一个大型的单户住宅数据集 包括每个房产的前两个销售价格 销售日期 我对整个数据集进行了地理编码 并获取了每个属性的高程 我试图了解不同城市之间提升与房
  • React隐藏显示元素

    1 引入 2 添加布尔类型的状态变量 3 切换变量的状态值 4 给 div 赋值 给button按钮设置点击事件 这样就可以实现了 div
  • 网格问题(回溯/DP):最短路径(排除障碍物)+路径数量+路径最大/小和+判断路径存在

    一 网格中的最短路径 1 1 可以消除障碍物 LeetCode1293 网格中的最短路径 给你一个 m n 的网格 其中每个单元格不是 0 空 就是 1 障碍物 每一步 您都可以在空白单元格中上 下 左 右移动 如果您 最多 可以消除 k
  • 全景xml元素认识

    一个全景项目它最核心的文件就是xml文件 项目可以由很多个xml文件组成 用Include 引入 另外就是官方的plugin组件 krpano元素 krpano xml 文件的根元素 不能没有 include元素 嵌入 引入 其他xml文件
  • 代码覆盖率测试

    步骤 1 编译代码 gcc a c fprofile arcs ftest coverage 2 执行代码 a out 3 生成info文件 lcov d t test o test info b c 4 生成result文件夹 genht
  • aix 进程占用内存_AIX 5L上的共享库内存占用量

    本文研究了共享库如何在32位AIX 5L 5 3 上占用内存 并演示了以下命令 ps svmon slibclean 禁止 进程图 Genkld 风格 本文讨论了进程的虚拟地址空间 以及内核共享库段 如何检查它们以及如何解释上述各种诊断实用
  • POI Excel 基础(一)

    POI 5 2 3 官网 github POI HSSF and POI XSSF SXSSF 用于访问Microsoft Excel格式文件的Java API HSSF 是Horrible SpreadSheet Format的缩写 也即