使用poi操作导入excel代码示例

本文介绍了一种使用Java POI库处理Excel文件的方法,包括读取Excel数据并将其转化为二维数组或Map对象的过程。提供了具体代码实现,适用于单个工作表或多表数据的处理。

最近用的poi包,将常用的读取和创建方法贴出来下,jar包从intent网下就可以了

package pi3000.narris.servlet;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
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.CellValue;
/***
 * 解析excel数据文件:
 * 利用poi的jar包解析excel
 * operateSingleService方法:只能操作单一一张excel表,返回二维数组[有点小bug]
 * operateMulService方法:操作一个完整的excel工作目录,返回map对象【优先】
 * 返回字符串的二维数据(如果需要保持入库,就需要获取他的类型,可以考虑使用map来存放,
 *   或根据头字段查DB,转换为相应类型)
 * @author huawei
 *
 */
public class ExcelOperate extends HttpServlet {
 private static final long serialVersionUID = 1L;
 @SuppressWarnings("unchecked")
 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  response.setCharacterEncoding("UTF-8");
  String sheet = request.getParameter("sheet");
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  try {
   if(isMultipart){
    DiskFileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    fileUpload.setSizeMax(10 * 1024 * 1024);
    List<FileItem> items = fileUpload.parseRequest(request);
    //System.out.println(items.isEmpty());
    if("1".equals(sheet)){
     String[][] str = null;
     for(FileItem item : items){
      str = getSingleData(item.getInputStream(), 1);
     }
     //下面测试循环出二维数组中的内容
     for(int i=0;i<str.length;i++){
      System.out.print("第" + i + "行: ");
      for(int j=0;j<str.length;j++){
       System.out.print(str[i][j] + "  ");
      }
      System.out.println();
     }
    }else{
     Map<String, Map<String, List<String>>> maps = null;
     for(FileItem item : items){
      maps = getMulData(item.getInputStream(), 1);
     }
     Iterator<String> itekeys = maps.keySet().iterator();
     while(itekeys.hasNext()){
      String sheetName = itekeys.next();
      System.out.println("-------------" + sheetName + "---------------");
      Map<String, List<String>> mapv = maps.get(sheetName);//返回一张数据表
      for(int i = 0; i < mapv.size(); i++){
       List<String> listv = mapv.get(String.valueOf(i));
       System.out.print("第" + i + "行" + listv.size() + "列: ");
       for(int j = 0;j < listv.size(); j++){
        System.out.print(listv.get(j) + "  ");
       }
       System.out.println();
      }
     }
    }
   }else{
    System.out.println("~~~~(>_<)~~~~ ");
   }
  } catch (FileUploadException e) {
   e.printStackTrace();
  }
 }
 
 /**
     * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行
     * @param file 读取数据的源Excel
     * @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1
     * @return 读出的Excel中数据的内容
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static String[][] getSingleData(File file, int ignoreRows) throws FileNotFoundException, IOException {
       BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
       String[][] returnArray = operateSingleService(ignoreRows, in);
       return returnArray;
    }
   
    public static String[][] getSingleData(InputStream input, int ignoreRows) throws FileNotFoundException, IOException {
        BufferedInputStream in = new BufferedInputStream(input);
        String[][] returnArray = operateSingleService(ignoreRows, in);
        return returnArray;
    }
   
    public static Map<String, Map<String, List<String>>> getMulData(InputStream input, int ignoreRows) throws FileNotFoundException, IOException {
        BufferedInputStream in = new BufferedInputStream(input);
        Map<String, Map<String, List<String>>> returnMaps = operateMulService(ignoreRows, in);
        return returnMaps;
    }
    /***
     * 这个方法只能操作单一工作表,
     * 方法有缺陷未修改,可以考虑使用多表操作的operateMulService方法
     * @param ignoreRows
     * @param in
     * @return 一张数据表的二维数组
     * @throws IOException
     */
 private static String[][] operateSingleService(int ignoreRows, BufferedInputStream in) throws IOException {
  List<String[]> result = new ArrayList<String[]>();
  int rowSize = 0;
  // 打开HSSFWorkbook
  POIFSFileSystem fs = new POIFSFileSystem(in);
  HSSFWorkbook wb = new HSSFWorkbook(fs);
  HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
  HSSFCell cell = null;
  for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
   HSSFSheet st = wb.getSheetAt(sheetIndex);
      // 第一行为标题,不取
   for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
    HSSFRow row = st.getRow(rowIndex);
          if (row == null) {
           continue;
          }
          int tempRowSize = row.getLastCellNum() + 1;
          if (tempRowSize > rowSize) {
              rowSize = tempRowSize;
          }
          String[] values = new String[rowSize];
          Arrays.fill(values, "");
          boolean hasValue = false;
          for (int columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
              String value = "";
              cell = row.getCell(columnIndex);
              if (cell != null) {
                 switch (cell.getCellType()) {
                 case HSSFCell.CELL_TYPE_STRING://字符串格式
                     value = cell.getStringCellValue();
                     break;
                 case HSSFCell.CELL_TYPE_NUMERIC://数值格式
                     if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        Date date = cell.getDateCellValue();
                        if (date != null) {
                            value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                        }else{
                            value = "";
                        }
                     }else{
                        value = new DecimalFormat("0").format(cell.getNumericCellValue());
                     }
                     break;
                 case HSSFCell.CELL_TYPE_FORMULA://公式格式
                  CellValue cellValue = evaluator.evaluate(cell);//对格式生成的值进行计算
                     if(cellValue.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){//如果为数字类型
                      value = String.valueOf(new DecimalFormat("0").format(cellValue.getNumberValue()));
                     }else if(cellValue.getCellType() == HSSFCell.CELL_TYPE_STRING){//如果为字符串类型
                      value = cellValue.getStringValue();
                     }else{//如果未error类型
                      value = "";
                     }
                     break;
                 case HSSFCell.CELL_TYPE_BLANK://空白格式
                     break;
                 case HSSFCell.CELL_TYPE_ERROR://错误格式
                     value = "";
                     break;
                 case HSSFCell.CELL_TYPE_BOOLEAN://boolean格式
                     value = (cell.getBooleanCellValue() == true ? "Y" : "N");
                     break;
                 default:
                     value = "";
                 }
              }
              if (columnIndex == 0 && value.trim().equals("")) {
                 break;
              }
              values[columnIndex] = rightTrim(value);
              hasValue = true;
          }
          if (hasValue) {
              result.add(values);
          }
   }
  }
  in.close();
  String[][] returnArray = new String[result.size()][rowSize];
  for (int i = 0; i < returnArray.length; i++) {
   returnArray[i] = (String[]) result.get(i);
  }
  return returnArray;
 }
 /***
  *
  * @param ignoreRows 代表忽略的行
  * @param in 输入工作流
  * @return Map对象[一个工作薄]
  * @throws IOException
  */
 private static Map<String, Map<String, List<String>>> operateMulService(int ignoreRows, BufferedInputStream in) throws IOException {
  //代表一个excel工作薄
  Map<String, Map<String, List<String>>> maps = new HashMap<String, Map<String, List<String>>>();
  //代表一个单一工作表
  Map<String, List<String>> singleMap = null;
  //一行的多列内容集合
  List<String> singleList = null;
  // 打开HSSFWorkbook
  POIFSFileSystem fs = new POIFSFileSystem(in);
  HSSFWorkbook wb = new HSSFWorkbook(fs);
  HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(wb);
  HSSFCell cell = null;
  for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {//循环工作薄
   singleMap = new HashMap<String, List<String>>();
   HSSFSheet st = wb.getSheetAt(sheetIndex);
      // 第一行为标题,不取
   int rowNum = 0;//定义一个变量用于标志数据行数
   for (int rowIndex = ignoreRows; rowIndex < st.getLastRowNum(); rowIndex++) {//循环单一表中的行
    HSSFRow row = st.getRow(rowIndex);
          if (row == null) {
           continue;
          }
          singleList = new ArrayList<String>();//定义一个集合用于存放列的数据内容
          for (int columnIndex = 0; columnIndex < row.getLastCellNum(); columnIndex++) {//循环单一表中的列
           String value = "";
              cell = row.getCell(columnIndex);
              if (cell != null) {
                 switch (cell.getCellType()) {
                 case HSSFCell.CELL_TYPE_STRING://字符串格式
                     value = cell.getStringCellValue();
                     break;
                 case HSSFCell.CELL_TYPE_NUMERIC://数值格式
                     if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        Date date = cell.getDateCellValue();
                        if (date != null) {
                            value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                        }else{
                            value = "";
                        }
                     }else{
                        value = new DecimalFormat("0").format(cell.getNumericCellValue());
                     }
                     break;
                 case HSSFCell.CELL_TYPE_FORMULA://公式格式
                  CellValue cellValue = evaluator.evaluate(cell);//对格式生成的值进行计算
                     if(cellValue.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){//如果为数字类型
                      value = String.valueOf(new DecimalFormat("0").format(cellValue.getNumberValue()));
                     }else if(cellValue.getCellType() == HSSFCell.CELL_TYPE_STRING){//如果为字符串类型
                      value = cellValue.getStringValue();
                     }else{//如果未error类型
                      value = "";
                     }
                     break;
                 case HSSFCell.CELL_TYPE_BLANK://空白格式
                     break;
                 case HSSFCell.CELL_TYPE_ERROR://错误格式
                     value = "";
                     break;
                 case HSSFCell.CELL_TYPE_BOOLEAN://boolean格式
                     value = (cell.getBooleanCellValue() == true ? "Y" : "N");
                     break;
                 default:
                     value = "";
                 }
              }
              singleList.add(value);//一行中所有列的值的集合
          }
          //System.out.println(String.valueOf(rowIndex - 1)+"行,有" + singleList.size()+"列");
          singleMap.put(String.valueOf(rowNum++), singleList);//行号、列数据
   }
   rowNum = 0;
   maps.put(st.getSheetName(), singleMap);//工作表、表数据
  }
  in.close();
  return maps;
 }
 
 /**
  * 去掉字符串右边的空格
     * @param str 要处理的字符串
     * @return 处理后的字符串
     */
     private static String rightTrim(String str) {
       if (str == null) {
           return "";
       }
       int length = str.length();
       for (int i = length - 1; i >= 0; i--) {
           if (str.charAt(i) != 0x20) {
              break;
           }
           length--;
       }
       return str.substring(0, length);
    }
}

 

 

 

 

//贴出用到测试的jsp代码,还有判断浏览器的代码网上总结的也挺有用的

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html version="-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" language="utf-8" src="../javascript/jquery-1.4.3.js"></script>
<script type="text/javascript" language="utf-8" src="../javascript/jquery.form.js"></script>
<title>文件下载</title>
</head>
<script type="text/javascript">
 $(function(){
  /**
  判断浏览器类型和版本信息,如果真的IE浏览器可以直接调用下面的另一种简便方式判断
  var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        var s;
        (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
        (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
        (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
        (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
        (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
        //以下进行测试
        if (Sys.ie) document.write('IE: ' + Sys.ie);
        if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
        if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
        if (Sys.opera) document.write('Opera: ' + Sys.opera);
        if (Sys.safari) document.write('Safari: ' + Sys.safari);
  */
  
  $("#button").click(function(){
   $.ajax({
    type: "POST",
    //async:true,
    data: "method=prestartExcel",
    url: "/web/ExportExcelServlet",
    success: function(e){
     if(navigator.userAgent.indexOf("MSIE 9.0")>0){//其实不需要判断,此处是为了测试调用的效果
      window.open("/web/ExportExcelServlet?method=downloadExcel","_blank");
         ///window.location = "/web/ExportExcelServlet?method=downloadExcel";
     }
    },
    error: function(e){
     alert('下载失败');
    }
   });
  });
  
  $("#submit").submit(function(){
   var filename = $("#file").val();
   if(filename != null && filename != ""){
    var endswith = filename.substring(filename.length - 4, filename.length);
    if(".xls" == endswith){
     return true;
    }else{
     alert("上传文件类型不符合规范,仅限于excel类型文件格式");
    }
   }
   return false;
  });
 });
</script>
<body>
 <input type="button" value="导出EXCEL" id="button"/>
 <br/>
 hello,work,hello,work,fuck,hello,good,ok
 <form enctype="multipart/form-data" id="form" action="../excelOperate?sheet=2" method="post">
  上传附件:<input type="file" id="file" name="file"/>
  <input type="submit" id="submit" value="上传附件"/>
 </form>
</body>
</html>

 

源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方法。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方法获得曲线**: - 插值方法:依据关键帧信息,选用插值方法(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值