EXCEL导入
- 接口ExcelImport
- ExcelToDataTable
- 去除datatable中的空行RemoveEmpty
EXCEL导出 (请求方式必须为表单提交)
- 接口ExportPlantData(Void)
- 接口ExportPlantData
- 新建类 重写Npoi流方法
EXCEL导入
接口ExcelImport
/// <summary>
///导入Excel 先将文件保存到服务器本地 然后访问服务器文件地址,获取文件
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
[HttpPost]
public async Task<Result> ExcelImport()
{
var request = HttpContext.Current.Request;
var tableName=request.Params["TableName"];
var server = HttpContext.Current.Server;
HttpPostedFile postFile;
if (request.Files.Count > 0)
{
//单文件上传,多文件for
postFile = request.Files[0];
}
else
{
return Result.Failed("无文件");
}
try
{
var filePath = server.MapPath("~/UpLoad/");
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
var fileName = Path.GetFileName(postFile.FileName);
var fileExtention = Path.GetExtension(fileName);
if (fileExtention != ".xls" && fileExtention != ".xlsx")
{
return Result.Failed("文件格式非.xls 或 .xlsx");
}
var saveFileName = filePath + Guid.NewGuid() + fileExtention;
postFile.SaveAs(saveFileName);
_deleteFile = saveFileName;
var excelToList = await _service.ExcelToList(tableName, saveFileName);
if (excelToList == null || excelToList.Count<1 || excelToList[0] == null || excelToList[0].Count < 1)
return Result.Failed("文件为空");
return await _service.ExcelImport(tableName, excelToList) ? Result.Successed : Result.Failed("操作失败");
}
catch (Exception ex)
{
return Result.Failed(ex.ToString());
}
finally
{
if (!string.IsNullOrEmpty(_deleteFile))
File.Delete(_deleteFile);
}
}
ExcelToDataTable
/// </summary>
/// <param name="filePath">Excel位置</param>
/// <param name="tableName">Table名字</param>
/// <param name="sheetIndex">sheet索引</param>
/// <returns></returns>
public static Task<DataTable> ExcelToDataTable(string filePath, string tableName, int sheetIndex)
{
return Task.Run(() =>
{
DataTable fileToTable = new DataTable();
if (!string.IsNullOrEmpty(tableName))
{
fileToTable.TableName = tableName;
}
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workBook = null;
try {
workBook = new XSSFWorkbook(file);
}
catch {
workBook = new HSSFWorkbook(file);
}
ISheet sheet = workBook.GetSheetAt(sheetIndex);
//列头
foreach (ICell item in sheet.GetRow(sheet.FirstRowNum).Cells)
{
fileToTable.Columns.Add(item.ToString(), typeof(string));
}
//写入内容
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
rows.MoveNext();//跳过字段行
while (rows.MoveNext())
{
IRow row = (IRow)rows.Current;
if (string.IsNullOrEmpty(row.AsEnumerable().ToString()))
{
continue;
}
DataRow dr = fileToTable.NewRow();
for (int i = 0; i < row.LastCellNum; i++)
{
ICell item = row.GetCell(i);
if (item == null)
{
continue;
}
//foreach (ICell item in row.Cells)
//{
if (item.IsMergedCell)
{
for (int j = 0; j < sheet.NumMergedRegions; j++)
{
//获取合并单元格范围
var cellrange = sheet.GetMergedRegion(j);
// 这里是cell所在的合并单元格,添加处理代码
if (item.ColumnIndex >= cellrange.FirstColumn && item.ColumnIndex <= cellrange.LastColumn
&& item.RowIndex >= cellrange.FirstRow && item.RowIndex <= cellrange.LastRow)
{
item.SetCellValue(sheet.GetRow(cellrange.FirstRow).GetCell(cellrange.FirstColumn).ToString());
//下面的方法使item的位置 即ColumnIndex发生变化 为单元格有效值位置
//此方法影响行,而不影响列 即值会代替,而RowIndex不会有变化
//item= sheet.GetRow(cellrange.FirstRow).GetCell(cellrange.FirstColumn);
break;
}
}
}
#region 判断单元格类型 并赋值
switch (item.CellType)
{
case CellType.Boolean:
dr[item.ColumnIndex] = item.BooleanCellValue;
break;
case CellType.Error:
dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
break;
case CellType.Formula:
switch (item.CachedFormulaResultType)
{
case CellType.Boolean:
dr[item.ColumnIndex] = item.BooleanCellValue;
break;
case CellType.Error:
dr[item.ColumnIndex] = ErrorEval.GetText(item.ErrorCellValue);
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(item))
{
dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
dr[item.ColumnIndex] = item.NumericCellValue;
}
break;
case CellType.String:
string str = item.StringCellValue;
if (!string.IsNullOrEmpty(str))
{
dr[item.ColumnIndex] = str.ToString();
}
else
{
dr[item.ColumnIndex] = null;
}
break;
case CellType.Unknown:
case CellType.Blank:
default:
dr[item.ColumnIndex] = string.Empty;
break;
}
break;
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(item))
{
dr[item.ColumnIndex] = item.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
}
else
{
dr[item.ColumnIndex] = double.Parse(item.NumericCellValue.ToString("f2"));
}
break;
case CellType.String:
string strValue = item.StringCellValue;
if (!string.IsNullOrEmpty(strValue))
{
dr[item.ColumnIndex] = strValue;
}
else
{
dr[item.ColumnIndex] = null;
}
break;
case CellType.Unknown:
case CellType.Blank:
default:
dr[item.ColumnIndex] = string.Empty;
break;
}
#endregion
}
fileToTable.Rows.Add(dr);
}
}
RemoveEmpty(fileToTable);
return fileToTable;
});
}
去除datatable中的空行RemoveEmpty
/// <summary>
去除datatable中的空行RemoveEmpty
/// </summary>
/// <param name="dt"></param>
public static void RemoveEmpty(DataTable dt)
{
List<DataRow> removeList = new List<DataRow>();
for (int i = 0; i < dt.Rows.Count; i++)
{
bool rowDataIsNull = true;
for (int j = 0; j < dt.Columns.Count; j++)
{
if (!string.IsNullOrEmpty(dt.Rows[i][j].ToString().Trim()))
{
rowDataIsNull = false;
}
}
if (rowDataIsNull)
{
removeList.Add(dt.Rows[i]);
}
}
for (int i = 0; i < removeList.Count; i++)
{
dt.Rows.Remove(removeList[i]);
}
}
EXCEL导出 (请求方式必须为表单提交)
表单请求
post/get请求 action接口 参数 method data
<form method="post" action="ScoreStatisticsAndAnalysis.aspx">
<input type="text" name="method" id="method" value="DownLoadDesignatedExamination">
<input type="text" name="data" id="data" value="2086ec30-2f65-4ad0-bc45-866917e59e2c">
<input type="submit" value="fdasfdasf ">
</form>
接口ExportPlantData(Void)
using SAC.SIS.Web.Model;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
/// <summary>
/// 数据导出
/// </summary>
/// <returns></returns>
public void ExportPlantData(string paperId)
{
HSSFWorkbook workBook = new HSSFWorkbook();
ISheet sheet = workBook.CreateSheet("NumberOne");
sheet.SetColumnWidth(0, 10 * 256);
sheet.SetColumnWidth(1, 28 * 256);
sheet.SetColumnWidth(2, 28 * 256);
sheet.SetColumnWidth(3, 10 * 256);
sheet.SetColumnWidth(4, 20 * 256);
sheet.SetColumnWidth(5, 10 * 256);
sheet.CreateRow(0);
sheet.GetRow(0).HeightInPoints = 68;
#region 设置Excel第一行:即列名
List<string> columnsNames = new List<string> {
"序号",
"试卷名",
"区域",
"职务",
"姓名",
"分数"
};
for (int i = 0; i < columnsNames.Count; i++)
{
sheet.GetRow(0).CreateCell(i);
sheet.GetRow(0).GetCell(i).SetCellValue(columnsNames[i]);
}
#endregion
var fillingData = bll.GetDesignatedExaminationScore(paperId);
var newFileName = bll.GetPaperName(paperId) + ".xls";
foreach (var data in fillingData.Select((x, i) => new { x, i }))
{
int index = data.i + 1;
sheet.CreateRow(index);
for (int i = 0; i < columnsNames.Count; i++)
{
sheet.GetRow(index).CreateCell(i);
}
sheet.GetRow(index).GetCell(0).SetCellValue(data.x.Order);
sheet.GetRow(index).GetCell(1).SetCellValue(data.x.PaperName);
sheet.GetRow(index).GetCell(2).SetCellValue(data.x.CompanyName);
sheet.GetRow(index).GetCell(3).SetCellValue(data.x.Job);
sheet.GetRow(index).GetCell(4).SetCellValue(data.x.UserName);
sheet.GetRow(index).GetCell(5).SetCellValue(data.x.Score);
}
NpoiMemoryStream memoryStream = new NpoiMemoryStream();
memoryStream.AllowClose = false;
workBook.Write(memoryStream);
memoryStream.Flush();
memoryStream.Seek(0, SeekOrigin.Begin);
memoryStream.AllowClose = true;
HttpContext.Current.Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
HttpContext.Current.Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}", System.Web.HttpUtility.UrlEncode(newFileName, System.Text.Encoding.UTF8)));
HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
接口ExportPlantData
using NPOI.XSSF.UserModel;
using SAC.FXPIN.InputModel.DataFilling;
using SAC.FXPIN.IService.DataFilling;
using SAC.FXPIN.Service.DataFilling;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Cors;
using NPOI.SS.UserModel;
using SAC.FXPIN.Entity.DataFilling;
using System.Net.Http.Headers;
/// <summary>
/// 数据导出
/// </summary>
/// <returns></returns>
[HttpGet]
public HttpResponseMessage ExportPlantData(string stationName, string unitId, string unitType)
{
var typeName = "火电";
string newFileName = "测点填报.xlsx";
XSSFWorkbook workBook = new XSSFWorkbook();
ISheet sheet = workBook.CreateSheet("NumberOne");
sheet.SetColumnWidth(0, 10 * 256);
sheet.SetColumnWidth(1, 28 * 256);
sheet.SetColumnWidth(2, 28 * 256);
sheet.SetColumnWidth(3, 10 * 256);
sheet.SetColumnWidth(4, 30 * 256);
sheet.SetColumnWidth(5, 18 * 256);
sheet.SetColumnWidth(6, 10 * 256);
sheet.SetColumnWidth(7, 10 * 256);
sheet.SetColumnWidth(8, 10 * 256);
sheet.SetColumnWidth(9, 10 * 256);
sheet.CreateRow(0);
sheet.GetRow(0).HeightInPoints = 68;
#region 设置Excel第一行:即列名
List<string> columnsNames = new List<string> {
"序号",
"集团总部所需测点名",
"集团总部所需测点中文描述",
"注释",
"已建实时数据库电厂填写在电场实时数据库中的ID,为建实时数据库电厂填写DCS中的ID",
"已建实时数据库电厂填写在电场实时数据库中的中文描述,为建实时数据库电厂填写DCS中的中文描述",
"备注(对测点位置不明确的请注期)",
"单位",
"上限",
"下限"
};
for (int i = 0; i < 10; i++)
{
sheet.GetRow(0).CreateCell(i);
sheet.GetRow(0).GetCell(i).SetCellValue(columnsNames[i]);
}
#endregion
var fillingData = _service.GetTagFilling(new TagSelectInputModel { UnitId = unitId, UnitType = unitType });
Task.WaitAll(fillingData);//等待此线程结束
foreach (var data in fillingData.Result.Select((x, i) => new { x, i }))
{
int index = data.i + 1;
sheet.CreateRow(index);
for (int i = 0; i < 10; i++)
{
sheet.GetRow(index).CreateCell(i);
}
sheet.GetRow(index).GetCell(0).SetCellValue(data.x.OrderNumber);
sheet.GetRow(index).GetCell(1).SetCellValue(data.x.TagId);
sheet.GetRow(index).GetCell(2).SetCellValue(data.x.TagName);
sheet.GetRow(index).GetCell(3).SetCellValue(data.x.Description);
sheet.GetRow(index).GetCell(4).SetCellValue(data.x.StationId);
sheet.GetRow(index).GetCell(5).SetCellValue(data.x.StationDesc);
sheet.GetRow(index).GetCell(6).SetCellValue(data.x.TagDesc);
sheet.GetRow(index).GetCell(7).SetCellValue(data.x.Unit);
sheet.GetRow(index).GetCell(8).SetCellValue(data.x.TagMax.ToString());
sheet.GetRow(index).GetCell(9).SetCellValue(data.x.TagMin.ToString());
}
NpoiMemoryStream memoryStream = new NpoiMemoryStream();
memoryStream.AllowClose = false;
workBook.Write(memoryStream);
memoryStream.Flush();
memoryStream.Seek(0, SeekOrigin.Begin);
memoryStream.AllowClose = true;
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = System.Web.HttpUtility.UrlEncode(newFileName, System.Text.Encoding.UTF8)
//火狐浏览器乱码问题
// FileName = System.Web.HttpUtility.HtmlEncode(newFileName)
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return response;
}
新建类 重写Npoi流方法
public class NpoiMemoryStream : MemoryStream
{
public NpoiMemoryStream()
{
AllowClose = true;
}
public bool AllowClose { get; set; }
public override void Close()
{
if (AllowClose)
base.Close();
}
}
注:转载请注明出处