## **使用技术框架**
1、[https://github.com/nervgh/angular-file-upload](https://github.com/nervgh/angular-file-upload)
[官方效果演示](http://nervgh.github.io/pages/angular-file-upload/examples/simple/#)
2、EPPlus(能读写Excel 2007/2010文件的开源组件)
## **代码实现**
> 如果是多文件上传,是一个一个文件上传
### **html 前端代码**
~~~
<input type="file" nv-file-select uploader="vm.uploader" >
或
<input type="file" nv-file-select uploader="vm.uploader" class="col-xs-4 btn btn-sm green-meadow" >
~~~
如果是多文件上传
~~~
<input type="file" nv-file-select uploader="vm.uploader" multiple class="col-xs-4 btn btn-sm green-meadow" >
~~~
### **js 代码**
```
// 头部位置 加入FileUploader引用
angular.module('app').controller('xxx', [
'$scope','FileUploader',
function ($scope, fileUploader) {
```
```
//导入
vm.uploadedFileName = null;
vm.uploader = new fileUploader({
url: abp.appPath + 'Profile/UploadExcel', //上传文件接口
headers: {
"X-XSRF-TOKEN": abp.security.antiForgery.getToken()
},
queueLimit: 1, //如果是多文件上传 ,注释掉这行
autoUpload: true,
removeAfterUpload: true,
filters: [{
name: 'customFilter',
fn: function (item, options) {
//File type、size check
var type = '|' + item.type.slice(item.type.lastIndexOf('/') + 1) + '|';
console.dir(type);
console.dir(item);
if ('|vnd.openxmlformats-officedocument.spreadsheetml.sheet|'.indexOf(type) === -1 || item.size > (1048576 * 10)) {
abp.message.warn('只能上传xlsx后缀的excel文件,并且小于10M');
return false;
}
return true;
}
}]
});
// 请求成功回调
vm.uploader.onSuccessItem = function (fileItem, response, status, headers) {
if (response.success) {
var profileFilePath = abp.appPath + response.result.fileName;
vm.uploadedFileName = response.result.fileName;
//vm.picFileLists.push(profileFilePath);
processCheckService.importQCTemp1Excel({ //导入excel数据接口
path: vm.uploadedFileName
}).then(function (result) {
vm.refreshGrid();
app.notify.success("添加成功", result.config.executeDuration);
});
} else {
abp.message.error(response.error.message);
}
};
```
### **上传文件接口**
代码位置 :

```
public JsonResult UploadExcel()
{
try
{
//Check input
if (Request.Files.Count <= 0 || Request.Files[0] == null)
{
throw new UserFriendlyException(L("ProfilePicture_Change_Error"));
}
var file = Request.Files[0];
if (file.ContentLength > 1048576 * 10 ) //1MB.
{
throw new UserFriendlyException(L("ProfilePicture_Change_Info"));
}
//Delete old temp profile pictures
//AppFileHelper.DeleteFilesInFolderIfExists(_appFolders.TempFileDownloadFolder, "userProfileImage_" + AbpSession.GetUserId());
//Save new picture
var fileInfo = new FileInfo(file.FileName);
var imageFileName = "excel_" + AbpSession.GetUserId() + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + fileInfo.Extension;
string folderName = _appFolders.ExpressUploadImageFolder + "\\" + DateTime.Now.ToString("yyyy/MM");
if (!Directory.Exists(folderName))
Directory.CreateDirectory(folderName);
var imageFilePath = Path.Combine(folderName, imageFileName);
file.SaveAs(imageFilePath);
return Json(new AjaxResponse(new { fileName = "Upload\\" + DateTime.Now.ToString("yyyy/MM") + "\\" + imageFileName ,path = imageFilePath ,fileName2 = imageFileName }));
}
catch (UserFriendlyException ex)
{
return Json(new AjaxResponse(new ErrorInfo(ex.Message)));
}
}
```
### **导入数据到数据库**
~~~
public async Task ImportQCTemp1Excel(ImportExcelInput input)
{
List<QCTemp1> strList = GetSheetValues(input.Path);
using (DapperDbContext Context = new DapperDbContext("Default"))
{
foreach (QCTemp1 qCTemp1 in strList)
{
Context.Insert<QCTemp1>(qCTemp1);
}
}
}
public IAppFolders AppFolders { get; set; }
/// <summary>
/// 检查excel 表格值是否为空
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private string CheckCellValue(object value) {
if (value == null)
{
return "";
}
else
{
return value.ToString();
}
}
private string GetDoubleCellValue(string value) {
try {
return double.Parse(value)+"";
}
catch (Exception e) {
return "";
}
}
private List<QCTemp1> GetSheetValues(string path)
{
var file = new FileInfo(AppFolders.RootPath + path);
if (file == null) return null;
List<QCTemp1> strList = new List<QCTemp1>();
using (var package = new ExcelPackage(file))
{
ExcelWorksheets worksheets = package.Workbook.Worksheets;
ExcelWorksheet worksheet = worksheets[1]; // 这个地方必须是1,不是从0 开始
var columns = worksheet.Dimension.Columns;
// row 等于2 是因为第一行是标题行
for (int row = 2; row <= worksheet.Dimension.Rows; row++)
{
QCTemp1 qCTemp1 = new QCTemp1();
qCTemp1.Id = 0;
for (int cel = 1; cel <= columns; cel++) // 这里必须是1 不是从0 开始
{
switch (cel) {
case 1:
qCTemp1.AddCode = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 2:
qCTemp1.AA = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 3:
qCTemp1.BB = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 4:
qCTemp1.CC = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 5:
qCTemp1.DD = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 6:
qCTemp1.EE = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 7:
qCTemp1.FF = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 8:
qCTemp1.GG = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 9:
qCTemp1.HH = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 10:
qCTemp1.II = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 11:
qCTemp1.JJ = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 12:
qCTemp1.LL = GetDoubleCellValue(CheckCellValue(worksheet.Cells[row, cel].Value));
break;
case 13:
qCTemp1.KK = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 14:
qCTemp1.MM = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 15:
qCTemp1.NN = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
case 16:
qCTemp1.PP = CheckCellValue(worksheet.Cells[row, cel].Value);
break;
}
}
strList.Add(qCTemp1);
}
return strList;
}
}
~~~
- 命名规范
- baseService类规范
- 类创建规范
- 函数方法创建规范
- Linq规范
- API规范
- 注释规范
- EF数据迁移操作
- 常规更新
- __MigrationHistory 表没了的情况处理
- __MigrationHistory 数据记录被删
- __MigrationHistory 记录和本地更新文件不匹配
- migrate工具做数据迁移
- 同步服务
- 配置
- 错误
- ORA-03115: 不支持的网络数据类型或表示法
- MES平板常用代码
- 栏目说明
- 异步线程
- 委托(模拟触发事件)
- 添加菜单
- 添加按钮
- GridVIew列表使用
- 配置文件读写
- 弹窗提示
- 消息列表控件
- API网络接口配置
- 设置扫描枪钩子
- ScanerHook 的扫码勾子写法
- 当前全局变量
- 定时器,关闭当前窗口
- 单例模式窗口
- 配置参数
- 输入框回车事件
- 修改GridView 指定行背景颜色
- 调用窗口页面
- form窗体继承
- 控件焦点
- 串口
- 自动选择可用串口
- CPS常用代码
- 栏目说明
- 系统管理(基础模块)
- 基础数据(基础模块)
- 资料配置(基础模块)
- 质检管理
- 生产计划
- 库存交易单据(wms)
- Job 管理
- 设备管理
- 报表查询
- SMT查询
- EWI
- 消息推送服务
- 异步线程Task
- 创建权限
- 增删改查操作
- 修改
- 删除
- 添加
- 单个实体类查询
- 分页查询
- 列表查询
- 批量更新
- 发起HTTP请求
- 授权配置
- 文件上传(以excel导入为例)
- 获取当前目录的物理地址
- 使用GET的Query参数(http请求)
- 只传ID参数写法
- 关于前后端分离
- 前端
- 输入框自动大写
- 前端搜索列表页写法
- routes.js
- index.cshtml
- index.js
- 前端列表选择弹窗
- Grid高度自适应
- 弹窗提示
- 时间类型格式化
- 自动填充
- Grid控件多选处理
- 导出csv
- Grid锁定、冻结CheckBox
- 自定义弹出框写法
- 获取项目名词方法
- 获取当前路由信息
- 获取页面分页信息
- Grid 行详情写法
- EF 与 Dapper 同时使用方法
- EF查询扩展
- Dapper查询方式
- ISqlExecuter 查询方式
- 复杂业务处理方法(请求超时)
- 方法1:前端交互优化
- 方法2:后台任务
- 登录页面无法跳转,报错问题解决
- 重要接口
- 关于只传ID一个参数接口写法
- 添加一个单表查询、或简单页面
- 工序排序问题解决
- 数据库配置
- 工序序号排序
- 设置webconfig配置信息和使用
- 添加cookies
- 用户数据权限写法
- 字符串写法
- 日志打印
- 时间戳打印测试
- abp 依赖注入
- 编码转换
- TFS使用规范
- 申请授权
- 错误问题
- 平板提示“Object reference not ...”错误
- VS断点失效
- 对不起,在处理您的请求期间,产生了一个服务器内部错误
- 生成项目的时候没找到dll
- S2017 签名时出错: 未能对 bin\Debug\app.publish*.exe 签名。SignTool Error: No certificates were found
- CPS 提示“The build restored NuGet packages. Build the project again to include these packages in the build”
- 远程连接 报 CredSSP
- Linq 语句 “Unable to create a constant value of type 'System.Object'. ”
- 无法嵌入相互操作类
- Store update,insert,or delete statement affected
- 模块设计和打印功能
- 方式1:winform端标签模板
- 方式2:CPS网页标签模板
- 方式3:CPS打印Html网页内容
- index.cshtml
- index.js
- print.cshtml
- print.js
- CPS弹窗显示打印内容组件(JS)
- 打印代码
- AGV
- CPS端代码
- MES平板端代码
- 数据库表
- 区域类型
- EDI、WMS(U8反写)
- EDI数据库表
- WMS类型
- EDI类型
- CPS后台添加任务相关代码
- 采购到货
- 采购入库
- 领料出库(材料出库)
- 委外出库(材料出库)
- 生产工单出库(材料出库)
- 条码表
- 其他出库
- 销售出库
- 生产倒冲(材料出库)
- 执行任务(JuQuent.GoldServiceExportU8)
- 采购
- 产成品入库
- 材料出库
- SQL
- 规范语句模型
- 常用查询
- 优化案例
- Linq 转 string 输出
- 消息推送
- 基本架构
- 钉钉消息推送配置
- 微信消息推送配置
- 消息模板设置
- 接口
- 码云api
