导入excel解析数据

实际上就是附件上传 上传之后用解析excel

示例:

1.用uploadfy上传 需要jquery.uploadify.v2.1.4.min.js

<input type="file" id="attach" value=""/>
<div id="up_file_queue" style="display:none">
</div>

js:

$("#attach").uploadify({
'uploader': '/resource/js/plugs/uploadify/uploadify.swf',//进度条,Uploadify里面含有 
'script': '/meter/importMeterReading',//一般处理程序 
'cancelImg': '/resource/js/plugs/uploadify/cancel.png',//取消图片路径 
'buttonImg': '/resource/js/plugs/uploadify/uploadButton.jpg',//图片路径 
'queueID': 'up_file_queue',
'auto': true,
'multi': true,
fileDataName : "attach",
height : 27,
width : 63,
method:'post',
removeCompleted : true,
fileExt:"*.xls;*.xlsx;",
fileDesc : 'xls;xlsx;',
sizeLimit:'10485760', 
onComplete:function(event, ID, fileObj, response, data){  
jQuery("#" + jQuery(event.target).attr('id') + ID).find('a').attr('href','javascript:void(0)').click(function(){
var ao =  jQuery.parseJSON(response);
deleteAffix(ao.id,ao.filename,$(this));
});
jQuery("#" + jQuery(event.target).attr('id') + ID).addClass('completed');
//判断返回值
if(response=="\"fail\""){
$.messageBox({message:"导入失败",level: "error"});
return false;
}else if(response=="\"3\""){
$.messageBox({message:"只支持xls和xlsx格式",level: "info"});
$('#attach').uploadifyClearQueue();
return false;
}else if (response=="\"1\""){
$.messageBox({message:"请选择系统提供的模板",level: "info"});
$('#attach').uploadifyClearQueue();
return false;
}else{
$("#meterDialog").createDialog({
url:'/meter/toSureRecording',
width:870,
title:"请核对信息"
});
}
},
onError:function(event,ID,fileObj,errorObj){
debugger;
$.messageBox({message:"上传有误",level: "error"});  
$('#attach').uploadifyClearQueue();
}
});

java:

public Object uploadContract(MultipartFile attach,HttpServletRequest request)
throws Exception { 
try {
String uploadFileFileName=attach.getOriginalFilename();
String ext = uploadFileFileName.substring(uploadFileFileName
.lastIndexOf("."));
MeterRecordExcel excelReader=new MeterRecordExcel();
Object result=null;
if(ext.equals(".xls")){
result=excelReader.readExcelXLS(attach.getInputStream());
}else if(ext.equals(".xlsx")){
result=excelReader.readExcelXLSX(attach.getInputStream());
}else{
return 3;
}
if(null!=result && !result.toString().equals("1") && !result.toString().equals("3")){
//解析result 判断获取的数据是否合法
List<Map<String,Object>> importList=meterReadingRecordService.fenxiResultExcel((List<MeterRecord>)result);
request.getSession().setAttribute("importList", importList);
result="2";
}
return result;
} catch (Exception e) {
e.printStackTrace();
}
return "fail";
}

MeterRecordExcel :

package com.harmony.meter.common;


import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import com.harmony.meter.domain.MeterRecord;


/**
 * 操作Excel表格的功能类
 * 
 * @author:
 * @version
 */


public class MeterRecordExcel {

public Object readExcelXLS(InputStream inputStream) {
try {
POIFSFileSystem poiFileSystem = new POIFSFileSystem(inputStream);
// 得到文档对象
HSSFWorkbook workbook= new HSSFWorkbook(poiFileSystem);
// 得到第一个表单
HSSFSheet aSheet= workbook.getSheetAt(0);
if(null==aSheet || null==aSheet.getRow(0) || aSheet.getRow(0).getPhysicalNumberOfCells()<8){
return "1";//表单格式不对
}
int lastRow=1;
List<MeterRecord> result = new ArrayList<MeterRecord>();
for (int i = 1; i <= lastRow; i++) {
MeterRecord MeterRecord = new MeterRecord();
for (int j = 0; j <= 13; j++) {
HSSFRow row = aSheet.getRow(i); // 得到 第 n 行
if(null==row){
break;
}
HSSFCell cell = row.getCell(j); // 得到每行 第 n列
String param = getCellValue(cell); // 解析当前列的值
setMeterRecordDetail(j,MeterRecord,param);
}
result.add(MeterRecord);
//如果下一行不为空才会遍历下一行
if(null !=aSheet.getRow(i+1)){
lastRow++;
}
}
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}


public Object readExcelXLSX(InputStream inputStream) {
try {
// 得到文档对象
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);  
// 得到第一个表单
XSSFSheet aSheet= workbook.getSheetAt(0);
if(null==aSheet || null==aSheet.getRow(0) || aSheet.getRow(0).getPhysicalNumberOfCells()<8){
return "1";//表单格式不对
}
int lastRow=1;
List<MeterRecord> result = new ArrayList<MeterRecord>();
for (int i = 1; i <= lastRow; i++) {
MeterRecord meterRecord = new MeterRecord();
for (int j = 0; j <= 13; j++) {
XSSFRow row = aSheet.getRow(i); // 得到 第 n 行
if(null==row){
break;
}
XSSFCell cell = row.getCell(j); // 得到每行 第 n列
String param = getCellValueX(cell); // 解析当前列的值
setMeterRecordDetail(j,meterRecord,param);
}
result.add(meterRecord);
//如果下一行不为空才会遍历下一行
if(null !=aSheet.getRow(i+1)){
lastRow++;
}
}
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*
* s设置返回的数据
*/
private void setMeterRecordDetail(int j, MeterRecord meterRecord, String param) {
if(j==0){
meterRecord.setBiaohao(param);
}else if(j==1){
meterRecord.setHuhao(param);
}else if(j==2){
meterRecord.setShangci(param);
}else if(j==3){
meterRecord.setZheci(param);
}else if(j==4){
meterRecord.setShuiliang(param);
}else if(j==5){
meterRecord.setJbstate(param);
}else if(j==6){
meterRecord.setCopyDate(param);
}else if(j==7){
meterRecord.setCopyUser(param);
}

}
private String getCellValueX(XSSFCell cell) {
String param = "";
if (null!=cell){
int type = cell.getCellType();
switch (type) {
case 0:
if(HSSFDateUtil.isCellDateFormatted(cell)){
//用于转化为日期格式
Date d = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
param = formater.format(d);
}else{
Double d = cell.getNumericCellValue();
param = d.toString();
}
break;
case 1:
param = cell.getStringCellValue();
break;
default:
param = "";
break;
}
}
return param;
}
private String getCellValue(HSSFCell cell) {
String param = "";
if (null!=cell) {
int type = cell.getCellType();
switch (type) {
case 0:
if(HSSFDateUtil.isCellDateFormatted(cell)){
//用于转化为日期格式
Date d = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
param = formater.format(d);
}else{
Double d = cell.getNumericCellValue();
param = d.toString();
}
break;
case 1:
param = cell.getStringCellValue();
break;
default:
param = "";
break;
}
}
return param;
}
}


<think>好的,我现在需要解决用户的问题:如何在微信小程序中实现Excel数据解析并将数据导入到微信小程序云数据库。首先,我得先理解用户的需求。用户希望上传Excel文件,解析其中的数据,然后存储到云数据库里。根据用户提供的引用内容,我需要结合现有的方法,整理出一个步骤清晰的教程。 首先,用户提到的引用[2]中有一个上传文件的示例代码,使用的是wx.cloud.uploadFile方法。这说明上传部分需要用到云开发的上传功能,将Excel文件上传到云存储。然后,用户提到引用[3]中的node.js函数使用node-xlsx库来解析Excel文件。但小程序端可能无法直接使用node-xlsx,所以可能需要结合云函数来处理解析。 接下来需要考虑的是权限问题。引用[1]提到在导入数据时需要添加_openid字段来指定数据的所有者,以确保权限控制。所以在存储到数据库时,必须为每条数据添加这个字段。 步骤可能包括:前端上传Excel文件到云存储,触发云函数下载并解析Excel,然后将数据写入云数据库。需要注意的是,小程序前端无法直接解析Excel文件,所以必须依赖云函数来完成解析工作。 然后要检查各个步骤的具体实现。上传文件部分,用户已经提供了示例代码,可能需要调整云路径和错误处理。解析部分,云函数需要使用node-xlsx库,安装后读取文件内容,处理数据,然后批量插入数据库。同时,要考虑数据量大的情况,可能需要分批次插入,避免超时或内存问题。 权限方面,确保每条记录都有_openid字段,这可能需要在解析数据时手动添加,或者在前端上传时携带用户信息。另外,云函数的调用权限和数据库的写入权限也需要配置正确,避免出现权限错误。 可能的难点在于云函数的编写和调试,以及处理不同格式的Excel文件。需要确保解析后的数据格式与数据库集合的字段匹配,否则会导致插入失败。此外,云函数的超时时间默认是20秒,如果处理大量数据可能需要延长超时时间或者优化解析和插入的效率。 最后,测试整个流程:上传文件,触发云函数,解析数据,写入数据库,并验证数据是否正确存储。同时,处理可能出现的错误,比如文件格式错误、数据格式不匹配等,给出相应的错误提示。</think>以下是在微信小程序中实现Excel数据解析导入数据库的完整方法: ### 一、前端文件上传实现 1. 使用`wx.chooseMessageFile`选择Excel文件: ```javascript wx.chooseMessageFile({ count: 1, type: 'file', success(res) { const tempFilePath = res.tempFiles[0].path this.uploadExcel(tempFilePath) } }) ``` 2. 上传文件到云存储(引用[2]实现): ```javascript uploadExcel(path) { wx.cloud.uploadFile({ cloudPath: `excel/${Date.now()}.xlsx`, filePath: path, success: res => { wx.showToast({ title: '上传成功' }) this.callParseFunction(res.fileID) // 触发云函数解析 }, fail: err => console.error('上传失败', err) }) } ``` ### 二、云函数解析实现 1. 安装依赖(引用[3]方法): ```bash npm install node-xlsx mysql ``` 2. 云函数核心代码: ```javascript const xlsx = require('node-xlsx') const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { const { fileID } = event // 下载云存储文件 const res = await cloud.downloadFile({ fileID }) const buffer = res.fileContent // 解析Excel const sheets = xlsx.parse(buffer) const data = sheets[0].data // 获取第一张表数据 // 转换数据结构(示例) const records = data.slice(1).map(row => ({ _openid: event.userInfo.openId, // 关键权限字段[^1] name: row[0], age: row[1], createTime: db.serverDate() })) // 批量写入数据库 const db = cloud.database() const result = await db.collection('your_collection').add({ data: records }) return { inserted: result.stats.updated } } ``` ### 三、关键注意事项 1. **权限控制**:必须为每条记录添加`_openid`字段,这是小程序权限体系的核心标识[^1] 2. **数据转换**:需要根据Excel列顺序映射到数据库字段 3. **性能优化**:单次插入建议不超过500条,大数据量需分批次处理 4. **文件限制**:云函数内存限制256MB,建议单个Excel文件不超过5万行 ### 四、完整调用流程 ``` 选择文件 → 上传云存储 → 触发云函数 → 解析数据 → 写入数据库 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值