`
yutiansky
  • 浏览: 197627 次
  • 性别: Icon_minigender_1
  • 来自: 本溪
社区版块
存档分类
最新评论

(java入门)用apache.poj读写Excel文件的例子(1)

阅读更多

本例用到以下Class,完成对Excel的基本读写。我用的Excel是2003

 

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;

 

package net.tianyu.study.poi;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;

public class DiffXls {

    private static final String KEY_MARK         = "key";
    private static final String END_MARK         = "end";
    private static final String UPDATE_DATA_MARK = "Updated";
    private static final int    MAX_LINES        = 3000;

    private HSSFWorkbook        wb;
    private HSSFSheet           sheet;
    private List<Integer>       keyColumns       = new ArrayList<Integer>();
    private List<KeyData>       orgKeyList       = new ArrayList<KeyData>();
    private int                 dataStartRow;
    private int                 dataEndColumn;
    private FileOutputStream    out              = null;
    private FileInputStream     in               = null;
    private short               updateColor      = IndexedColors.LIGHT_YELLOW.getIndex();
    private short               insertColor      = IndexedColors.LIGHT_GREEN.getIndex();
    private short               deleteColor      = IndexedColors.GREY_25_PERCENT.getIndex();

    public void open(String inputFileName, String outputFileName) throws IOException {
        in = new FileInputStream(inputFileName);
        out = new FileOutputStream(outputFileName);
        POIFSFileSystem filein = new POIFSFileSystem(in);
        wb = new HSSFWorkbook(filein);
        sheet = wb.getSheetAt(0);
    }

    public void run() throws IOException {
        initKeyColumn();
        initOrgKeyList();
        initDataStartRow();

        startDiff();

        format();
        wb.write(out);
    }

    public void close() throws IOException {
        out.close();
        in.close();
    }

    private void initKeyColumn() {
        HSSFRow markRow = sheet.getRow(0);
        for (int i = 0; i < MAX_LINES; i++) {
            HSSFCell cell = markRow.getCell(i);
            if (cell != null && KEY_MARK.equals(cell.getStringCellValue())) {
                keyColumns.add(i);
                System.out.println(i);
            }
            if (cell != null && END_MARK.equals(cell.getStringCellValue())) {
                dataEndColumn = i;
                System.out.println("dataEndColumn :" + dataEndColumn);
                break;
            }
        }
    }

    private void initOrgKeyList() {
        for (int i = 2; i < MAX_LINES; i++) {
            HSSFRow dataRow = sheet.getRow(i);
            if (dataRow == null) {
                break;
            }
            KeyData key = new KeyData();
            key.setRow(i);
            for (Integer keyColumn : keyColumns) {
                HSSFCell cell = dataRow.getCell(keyColumn);
                if (cell != null) {
                    if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        key.addValue(cell.getStringCellValue());
                    }
                    else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                        key.addValue(Double.toString(cell.getNumericCellValue()));
                    }
                }
            }
            System.out.println(key.toString());
            orgKeyList.add(key);
        }
    }

    private void format() {
        for (int i = 0; i < dataEndColumn; i++) {
            sheet.autoSizeColumn(i);
            int width = sheet.getColumnWidth(i);
            if (width > 256 * 100) {
                sheet.setColumnWidth(i, 256 * 100);
            }
        }
    }

    private void initDataStartRow() {
        for (int i = 1; i < MAX_LINES; i++) {
            HSSFRow dataRow = sheet.getRow(i);
            if (dataRow == null) {
                continue;
            }
            HSSFCell cell = dataRow.getCell(0);
            if (cell != null && cell.getCellType() == HSSFCell.CELL_TYPE_STRING
                && UPDATE_DATA_MARK.equals(cell.getStringCellValue())) {
                dataStartRow = i + 2;
                break;
            }
            if (cell != null && cell.getCellType() == HSSFCell.CELL_TYPE_STRING
                && END_MARK.equals(cell.getStringCellValue())) {
                break;
            }
        }
        System.out.println(dataStartRow);
    }

    private int matchKeyRow(KeyData key) {
        for (KeyData orgKey : orgKeyList) {
            if (orgKey.equals(key)) {
                orgKey.setHasSameData(true);
                return orgKey.getRow();
            }
        }
        return 0;
    }

    private boolean isSameData(int orgRow, int targetRow) {
        boolean result = true;
        for (int i = 0; i < dataEndColumn; i++) {
            HSSFRow orgData = sheet.getRow(orgRow);
            HSSFRow targetData = sheet.getRow(targetRow);
            if (orgData == null || targetData == null) {
                result = false;
            }

            HSSFCell orgCell = orgData.getCell(i);
            HSSFCell targetCell = targetData.getCell(i);

            if (orgCell == null && targetCell == null) {
                continue;
            }
            if (orgCell == null && targetCell != null) {
                setCellColor(orgCell, updateColor);
                setCellColor(targetCell, updateColor);
                result = false;
            }
            if (targetCell == null && orgCell != null) {
                setCellColor(orgCell, updateColor);
                setCellColor(targetCell, updateColor);
                result = false;
            }
            if (orgCell.getCellType() != targetCell.getCellType()) {
                setCellColor(orgCell, updateColor);
                setCellColor(targetCell, updateColor);
                result = false;
            }
            if (orgCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                if (!orgCell.getStringCellValue().equals(targetCell.getStringCellValue())) {
                    setCellColor(orgCell, updateColor);
                    setCellColor(targetCell, updateColor);
                    result = false;
                }
            }
            if (orgCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                if (orgCell.getNumericCellValue() != targetCell.getNumericCellValue()) {
                    setCellColor(orgCell, updateColor);
                    setCellColor(targetCell, updateColor);
                    result = false;
                }
            }
        }

        return result;
    }

    private void startDiff() {
        for (int i = dataStartRow; i < MAX_LINES; i++) {
            HSSFRow dataRow = sheet.getRow(i);
            if (dataRow == null) {
                break;
            }
            HSSFCell cell = dataRow.getCell(0);
            if (cell != null && cell.getCellType() == HSSFCell.CELL_TYPE_STRING
                && END_MARK.equals(cell.getStringCellValue())) {
                break;
            }
            KeyData key = new KeyData();
            key.setRow(i);
            for (Integer keyColumn : keyColumns) {
                cell = dataRow.getCell(keyColumn);
                if (cell != null) {
                    if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        key.addValue(cell.getStringCellValue());
                    }
                    else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                        key.addValue(Double.toString(cell.getNumericCellValue()));
                    }
                }
            }
            int orgRow = matchKeyRow(key);

            if (orgRow != 0) {
                System.out.println("updateRow : " + i + " orgRow : " + orgRow + " " + isSameData(i, orgRow));
            }
            else {
                setRowColor(i, insertColor);
            }
        }
        setDeleteColor();
    }

    private void setDeleteColor() {
        for (KeyData orgKey : orgKeyList) {
            if (!orgKey.isHasSameData()) {
                setRowColor(orgKey.getRow(), deleteColor);
            }
        }
    }

    private void setRowColor(int row, short color) {
        HSSFRow dataRow = sheet.getRow(row);
        for (int i = 0; i < dataEndColumn; i++) {
            HSSFCell cell = dataRow.getCell(i);
            if (cell == null) {
                cell = dataRow.createCell(i);
            }
            setCellColor(cell, color);
        }
    }

    private void setCellColor(HSSFCell cell, short color) {
        CellStyle style = wb.createCellStyle();
        style.cloneStyleFrom(cell.getCellStyle());
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        style.setFillForegroundColor(color);
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setBorderRight(CellStyle.BORDER_THIN);
        cell.setCellStyle(style);
    }
}

 

分享到:
评论

相关推荐

    poi4.1.2以及所有依赖,源码,文档.zip

    org.apache.poi:poi:4.1.2 org.apache.poi:poi-ooxml:4.1.2 org.apache.poi:poi-ooxml-schemas:4.1.2 org.apache.xmlbeans:xmlbeans:3.1.0 com.github.virtuald:curvesapi:1.06 com.zaxxer:SparseBitSet:1.2 commons...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ 1751 求最小生成树prim算法(JAVA)

    总的来说,POJ 1751挑战要求程序员用Prim算法解决求解最小生成树的问题,这涉及到对图论的理解,以及在Java环境中实现和测试该算法的能力。对于想要提升数据结构和算法技能的开发者来说,这是一个很好的实践题目。...

    java操作Excel-jxl与poj的比较 .docx

    Java操作Excel时,有两种常用的库:jxl和Apache POI(POJ是POI的一部分,全称为Plain Old Java Objects)。这两个库都允许开发者在Java应用程序中读取、写入和修改Excel文件,但它们有不同的特性和适用场景。 **jxl...

    POJ1004-Financial Management

    在解决此类问题时,通常会使用C++等编程语言,因此`POJ1004-Financial Management.cpp`文件很可能包含了用C++编写的源代码。代码可能包含了读取输入、处理数据、计算结果和输出答案等核心功能。同时,`POJ1004-...

    poj题目代码

    5. poj_1002.c - "Addition":这是最基础的加法问题,虽然简单,但却是所有计算的基础,体现了编程语言的基本运算符使用。 6. poj_2503.c - "Sudoku":九宫格数独,需要解决的问题是如何填充空格使得每一行、每一列...

    poj.rar_poj

    标题中的"poj.rar_poj"暗示了这是一个与POJ(Programming Online Judge)相关的压缩文件,POJ是一个在线编程竞赛平台,主要供程序员们练习和提交算法解决方案。在这个压缩包中,很可能包含了用户在POJ上参与编程挑战...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    1. poj1082 "Bridge"(桥) 这个问题是关于网络连通性的。给定一个图,你需要找出最长的一条由桥(边的删除会导致图变成多个连通分量)组成的路径。解决这个问题通常采用深度优先搜索(DFS)或广度优先搜索(BFS)...

    poj1001java biginteger

    用java的biginteger实现的poj1001,比较简单的方法

    北大poj JAVA源码

    【北大POJ JAVA源码】是一系列用于解决北京大学在线编程平台(POJ)问题的Java程序集合。这个压缩包中的代码资源,对于学习Java编程、算法设计和优化以及熟悉在线编程竞赛有着重要的参考价值。POJ是北京大学面向全国...

    ACM POJ PKU 最全题目分类

    ### ACM POJ PKU 最全题目分类解析 #### 动态规划(DP) 在计算机科学领域,动态规划(Dynamic Programming, DP)是一种重要的算法思想,主要用于解决多阶段决策过程中的优化问题。它通过将原问题分解成相互重叠的...

    凸包练习: POJ 2187(JAVA)

    【标题】"凸包练习: POJ 2187(JAVA)" 是一个关于编程算法的挑战,主要涉及计算机科学中的几何算法。在本问题中,我们关注的是二维平面上的点集及其凸包(Convex Hull)的概念。凸包可以被理解为一个最小的多边形,该...

    POJ.rar_poj

    【标题】"POJ.rar_poj" 指的是一份与编程竞赛相关的压缩文件,主要涉及POJ(Problem Overloading Judge)平台上的问题解答。POJ是一个在线的编程竞赛平台,它为参赛者提供了大量的算法题目进行练习和比赛,以提升...

    POJ2002-Squares

    1. "POJ2002-Squares.cpp":这是一个C++源代码文件,包含了解决此问题的程序。C++是一种常用的编程语言,特别适合处理算法和性能敏感的问题。 2. "POJ2002-Squares.doc":这可能是一个Microsoft Word文档,包含了...

    poj 图论 集合

    根据提供的文件信息,本文将对其中提及的几个POJ(Peking University Judge Online)平台上的图论题目进行详细的解析,并介绍解决这些问题时所使用的算法和技术。这些题目涵盖了图论中的多个核心概念,如最短路径、...

    POJ 1045.rar

    2. "1045" - 这个文件名可能是问题1045的源代码文件,可能命名为“1045.cpp”或“1045.java”等,具体取决于使用的编程语言。它包含了直接解决POJ 1045问题的算法实现。 综上所述,这个压缩包提供的资源可以帮助...

Global site tag (gtag.js) - Google Analytics