背景:1.pringmvc 框架下 的excel 导入导出

     2.OI 操作office.

 

页面代码:

<div class="modal fade bs-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
      <div class="modal-dialog modal-lg" style="width:400px;">
        <div class="modal-content">
            <div style="height:300px;padding:10px;">
                <h1>批量导入商品信息</h1>
                <div style="margin-top:20px;padding:0px 5px 15px 5px;">
                    <span><strong>1.下载模板 > 2.导入模板 >3.导入完成</strong></span><br/>
                    <span><strong>温馨提示:</strong></span>
                    <div style="line-height:50px;">导入模板格式不能修改,否则会导致导入失败!</div>
                    <a  href="${webRoot}/product/downExcel">下载导入模板</a>
                </div>
                <div>
                    <form action="${webRoot}/product/importExcel" id="excelForm" method="post" enctype="multipart/form-data">
                    <input type="file" name="file" />
                        <div style="text-align:right;padding-right:50px;">
                            <button type="button" id="import" class="btn btn-default" >导入</button>
                            <script>
                                $("#import").click(function(){
                                    $("#excelForm").submit();
                                });
                            </script>
                        </div>
                    </form>
                </div>
            </div>
        </div>
      </div>
    </div>

Controller 代码:

@RequestMapping("importExcel")
    public String addComm(ModelMap model, HttpServletRequest request) {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        MultipartFile file = multipartRequest.getFile("file");
        String[][] result = null;
        ExportUtil exportUtil = new ExportUtil();  
        try {
            exportUtil.SaveFileFromInputStream(file.getInputStream(),
                    request.getSession().getServletContext()
                    .getRealPath(File.separator)+"upload", "product.xls");
        File file1 = new File(request.getSession().getServletContext()
                .getRealPath(File.separator)+"upload" + "/product.xls");
            result =exportUtil.getData(file1, 4);
        } catch (Exception ex) {
            System.out.println("上传文件失败");
            ex.printStackTrace();
        }
        if (result == null) 
            return null;
        User user = (User)request.getSession().getAttribute("user");
        if(user==null) return "";
        int rowLength = result.length;
        List<Product> proList =exportUtil.doProduct(rowLength, result,user);
        ps.excelAdd(proList);
        return "redirect:/product/getproduct";
    }
    @RequestMapping("downExcel")
    @ResponseBody
    public String downExcel(HttpServletResponse response){
        try {
            ServletOutputStream outputStream = response.getOutputStream();
        
        String fileName = new String(("商品导入模板").getBytes(), "ISO8859_1");  
        response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");// 组装附件名称和格式
        es.exportExcel(outputStream,false);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        return "";
    }
    
    
    @RequestMapping("exportExcel")
    @ResponseBody
    public String exportExcel(HttpServletResponse response){
        try {
            ServletOutputStream outputStream = response.getOutputStream();
        
        String fileName = new String(("蓝图进销存商品导出").getBytes(), "ISO8859_1");  
        response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");// 组装附件名称和格式
        es.exportExcel(outputStream,true);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  
        return "";
    }

ExportService:

package com.ly.jxc.service;

import java.io.IOException;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.ss.util.CellRangeAddress;
import org.springframework.stereotype.Service;
import com.ly.jxc.dao.ProductClassDAO;
import com.ly.jxc.dao.ProductDAO;
import com.ly.jxc.dao.ProductUnitDAO;
import com.ly.jxc.entity.Product;
import com.ly.jxc.entity.ProductClass;
import com.ly.jxc.entity.ProductUnit;
import com.ly.jxc.util.ExportUtil;

@Service
public class ExportService {
    @Resource
    private ProductUnitDAO pud;
    @Resource
    private ProductClassDAO pcd;
    @Resource
    private ProductDAO pd;
      public void exportExcel(ServletOutputStream outputStream,boolean isDwon)  
        {  
            List<ProductUnit> puList = pud.getAllUnit();
            List<ProductClass> pcList = pcd.GetAllProductClass();
            // 创建一个workbook 对应一个excel应用文件   
            // HSSWorkbook 是03版excel 的个格式,XSSWorkbook 是07以上版本,HSS 和 XSS 开头分别代表03,07可以切换
            HSSFWorkbook workBook = new HSSFWorkbook();  
            // 在workbook中添加一个sheet,对应Excel文件中的sheet  
            HSSFSheet sheet = workBook.createSheet("商品导入导出"); 
            //表格默认行宽度
            sheet.setDefaultColumnWidth(15);
            sheet.setDefaultRowHeightInPoints(100);
            
            ExportUtil exportUtil = new ExportUtil(workBook, sheet);  
            //设置单元格格式
            HSSFCellStyle headStyle = exportUtil.getHeadStyle(false);  
            HSSFCellStyle bodyStyle = exportUtil.getBodyStyle();  
            //创建单元格
            HSSFCell cell = null;  
            //合并单元格
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
            //创建一行
            HSSFRow descRow = sheet.createRow(0);  
            //设置行高 单位是像素
            descRow.setHeightInPoints(80);
            //表示穿件的单元格是在第一行
            cell=descRow.createCell(0);
            //设置单元格格式
            cell.setCellStyle(exportUtil.getHeadStyle(true));  
            //设置单元格值
            cell.setCellValue("商品单位和类型填写必须填写对应的数字ID,否则会导入失败!"); 
            
            // 构建表头  
            HSSFRow unitRow = sheet.createRow(1);  
            unitRow.setHeightInPoints(40);
            cell=unitRow.createCell(0);
            cell.setCellStyle(headStyle);  
            cell.setCellValue("商品单位-ID:");  

            // 构建商品单位数据,动态构建导出数据
            if (puList != null && puList.size() > 0)  
            {  
                for (int j = 0; j < puList.size(); j++)  
                {  
                    ProductUnit pu = puList.get(j);
                    cell=unitRow.createCell(j+1);
                    cell.setCellStyle(bodyStyle);  
                    cell.setCellValue(pu.getName()+"--"+pu.getpId());  
                } 
            }
            // 构建商品类型表头 ,动态构建导出数据 
            HSSFRow classRow = sheet.createRow(2);  
            classRow.setHeightInPoints(40);
            cell=classRow.createCell(0);
            cell.setCellStyle(headStyle);  
            cell.setCellValue("商品类型-ID:");
            // 构建商品类型数据  
            if (pcList != null && pcList.size() > 0)  
            {  
                for (int j = 0; j < pcList.size(); j++)  
                {  
                    ProductClass pc = pcList.get(j);
                    cell=classRow.createCell(j+1);
                    cell.setCellStyle(bodyStyle);  
                    cell.setCellValue(pc.getName()+"--"+pc.getProductClass_ID());  
                } 
            }
               
              
                HSSFRow bodyRow = sheet.createRow(3);  
                bodyRow.setHeightInPoints(40);
  
                cell = bodyRow.createCell(0);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("条码");  
  
                cell = bodyRow.createCell(1);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("名字");  
  
                cell = bodyRow.createCell(2);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("类别ID");  
                
                cell = bodyRow.createCell(3);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("产品规格"); 
                
                cell = bodyRow.createCell(4);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("产品单位"); 
                
                cell = bodyRow.createCell(5);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("出售价格");  
                
                cell = bodyRow.createCell(6);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("进货价格"); 
                
                cell = bodyRow.createCell(7);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("最低价格");  
                
                cell = bodyRow.createCell(8);  
                cell.setCellStyle(headStyle);  
                cell.setCellValue("备注");  
                //如果是导出商品,则需要将商品数据写入
                if(isDwon){
                    
                    List<Product> proList = pd.getAllProducts();
                    for (int i = 0; i < proList.size(); i++) {
                            Product p =proList.get(i);
                           HSSFRow dateRow = sheet.createRow(4+i);  
                           bodyRow.setHeightInPoints(40);
                           
                           cell = dateRow.createCell(0);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getpId());  
                           
                           cell = dateRow.createCell(1);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getName());  
                           
                           cell = dateRow.createCell(2);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getpList());  
                           
                           cell = dateRow.createCell(3);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getPsID());  
                           
                           cell = dateRow.createCell(4);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getpUtilId()); 
                           
                           cell = dateRow.createCell(5);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getPrice());  
                           
                           cell = dateRow.createCell(6);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getStockPrice());  
                           
                           cell = dateRow.createCell(7);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getLowestPrice());  
                           
                           cell = dateRow.createCell(8);  
                           cell.setCellStyle(bodyStyle);  
                           cell.setCellValue(p.getRemark());         
                    }    
                }
            try  
            {  
                workBook.write(outputStream);  
                outputStream.flush();  
                outputStream.close();  
            }  
            catch (IOException e)  
            {  
                e.printStackTrace();  
            }  
            finally  
            {  
                try  
                {  
                    outputStream.close();  
                }  
                catch (IOException e)  
                {  
                    e.printStackTrace();  
                }  
            }  
      
        }  
    
}

辅助类ExportUtil:

package com.ly.jxc.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
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.List;

import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.springframework.beans.factory.annotation.Autowired;

import com.ly.jxc.entity.Product;
import com.ly.jxc.entity.User;

public class ExportUtil {

    private HSSFWorkbook wb = null;

    private HSSFSheet sheet = null;
    @Autowired
HttpSession session;
    /**
     * @param wb
     * @param sheet
     */
    public ExportUtil(HSSFWorkbook wb, HSSFSheet sheet) {
        this.wb = wb;
        this.sheet = sheet;
    }

    public ExportUtil() {
    }

    /**
     * 合并单元格后给合并后的单元格加边框
     * 
     * @param region
     * @param cs
     */
    public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) {
        int toprowNum = region.getFirstRow();
        for (int i = toprowNum; i <= region.getLastRow(); i++) {
            HSSFRow row = sheet.getRow(i);
            for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
                HSSFCell cell = row.getCell(j);// XSSFCellUtil.getCell(row,
                                                // (short) j);
                cell.setCellStyle(cs);
            }
        }
    }

    /**
     * 设置表头的单元格样式
     * 
     * @return
     */
    public HSSFCellStyle getHeadStyle(boolean isalert) {
        // 创建单元格样式
        HSSFCellStyle cellStyle = wb.createCellStyle();
        // 设置单元格的背景颜色为淡蓝色
        if (!isalert)
            cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
        else
            cellStyle.setFillForegroundColor(HSSFColor.RED.index);
        cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
        // 设置单元格居中对齐
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 设置单元格垂直居中对齐
        cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        // 创建单元格内容显示不下时自动换行
        cellStyle.setWrapText(true);
        // 设置单元格字体样式
        HSSFFont font = wb.createFont();
        // 设置字体加粗
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName("宋体");
        if (isalert) {
            font.setColor(HSSFColor.WHITE.index);
        }
        font.setFontHeight((short) 200);
        cellStyle.setFont(font);
        // 设置单元格边框为细线条
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
        return cellStyle;
    }

    /**
     * 设置表体的单元格样式
     * 
     * @return
     */
    public HSSFCellStyle getBodyStyle() {
        // 创建单元格样式
        HSSFCellStyle cellStyle = wb.createCellStyle();

        // 设置单元格居中对齐
        cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 设置单元格垂直居中对齐
        cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
        // 创建单元格内容显示不下时自动换行
        cellStyle.setWrapText(true);
        // 设置单元格字体样式
        HSSFFont font = wb.createFont();
        // 设置字体加粗
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        font.setFontName("宋体");
        font.setFontHeight((short) 200);
        cellStyle.setFont(font);
        // 设置单元格边框为细线条
        cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);

        return cellStyle;
    }

    // 将MultipartFile 转换为File
    public static void SaveFileFromInputStream(InputStream stream, String path,
            String savefile) throws IOException {
        FileOutputStream fs = new FileOutputStream(path + "/" + savefile);
        // System.out.println("------------"+path + "/"+ savefile);
        byte[] buffer = new byte[1024 * 1024];
        int bytesum = 0;
        int byteread = 0;
        while ((byteread = stream.read(buffer)) != -1) {
            bytesum += byteread;
            fs.write(buffer, 0, byteread);
            fs.flush();
        }
        fs.close();
        stream.close();
    }

    /**
     * 
     * 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行
     * 
     * @param file
     *            读取数据的源Excel
     * 
     * @param ignoreRows
     *            读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1
     * 
     * @return 读出的Excel中数据的内容
     * 
     * @throws FileNotFoundException
     * 
     * @throws IOException
     */

    public static String[][] getData(File file, int ignoreRows)throws Exception {
        List<String[]> result = new ArrayList<String[]>();
        int rowSize = 0;
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        // 打开HSSFWorkbook
        POIFSFileSystem fs = new POIFSFileSystem(in);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        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 (short 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:
                            // 导入时如果为公式生成的数据则无值
                            if (!cell.getStringCellValue().equals("")) {
                                value = cell.getStringCellValue();
                            } else {
                                value = cell.getNumericCellValue() + "";
                            }
                            break;
                        case HSSFCell.CELL_TYPE_BLANK:
                            break;
                        case HSSFCell.CELL_TYPE_ERROR:
                            value = "";
                            break;
                        case HSSFCell.CELL_TYPE_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 str
     *            要处理的字符串
     * 
     * @return 处理后的字符串
     */

    public 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);
    }
    public List<Product> doProduct(int rowLength,String[][] result,User user){
        // 默认从1 开始 本来是为0 剔除掉

                List<Product> proList = new ArrayList<Product>();
                Date date = new Date();
                for (int i = 0; i < rowLength; i++) {
                    Product pro = new Product();

                    for (int j = 0; j < result[i].length; j++) {// 默认从1开始添加
                        // 客户ID 客户名 客户类型 客户电话 客户状态 创建时间 放出时间 跟入时间 跟入人 放出人
                        // 27 法规和热 特级 1212121 1 41773 2014-05-14 10:20:48.0 yq1012
                        // 整理 id 去掉 。 创建时间 换成当前时间,,,放出时间 跟入时间 跟入人 放出人----全不要
                        // 格式如上
                        // System.out.print(result[i][j]+"\t\t");
                        if (j == 0) // 编码
                            pro.setpId(result[i][j]);
                        if (j == 1) // 名字
                            pro.setName(result[i][j]);
                        if (j == 2) // 类别
                            pro.setpList(Integer.parseInt(result[i][j]));
                        if (j == 3) // 商品规格
                            pro.setPsID(result[i][j]);
                        if (j == 4)// 单位
                            pro.setpUtilId(Integer.parseInt(result[i][j]));
                        if (j == 5)// 出售价格
                            pro.setPrice(Double.parseDouble(result[i][j]));
                        if (j == 6) // 进货价格
                            pro.setStockPrice(Double.parseDouble(result[i][j]));
                        if (j == 7)// 最低价格
                            pro.setLowestPrice(Double.parseDouble(result[i][j]));
                        if (j == 8)// 备注
                            pro.setRemark(result[i][j]);
                        
                    }
                    
                    pro.setUserId(user.getUser_Id());
                    proList.add(pro);
                    // crmService.saveCrmUser(crm);
                }
                return proList;
    }

}