NPOI導入excel

来源:http://www.cnblogs.com/hobby0524/archive/2017/04/18/6726149.html
-Advertisement-
Play Games

1.excel導入 public override string CheckAndImportFile(ref DataTable errorInfoDataTable) { porgressBar.SetProgress(5, "開始上傳文件到伺服器....."); //上傳文件到伺服器 file ...


1.excel導入

public override string CheckAndImportFile(ref DataTable errorInfoDataTable)
{

porgressBar.SetProgress(5, "開始上傳文件到伺服器.....");
//上傳文件到伺服器
file.SaveAs(filePath);
porgressBar.SetProgress(10, "文件已上傳到伺服器.....");

//用於保存檢查結果
errorInfoDataTable = new DataTable();
errorInfoDataTable.Columns.Add("數據行號");
errorInfoDataTable.Columns.Add("錯誤信息");

List<Proctor> excelData;
Dictionary<int, string> dicErrorInfo;
porgressBar.SetProgress(30, "準備讀取文件中數據........");

//獲取上傳excel中的數據
var importProctorHelper = new ImportProctorHelper();

var result = importProctorHelper.GetAndCheckUpLoadExcelData(filePath, new List<string> {testCampusCode},
porgressBar.SetProgress, out excelData, out dicErrorInfo);

porgressBar.SetProgress(90, "讀取文件中數據完畢,準備插入數據......");

if (!result._IsNullOrEmpty())
{
foreach (var item in dicErrorInfo)
{
errorInfoDataTable.Rows.Add(item.Key, item.Value);
}
if (errorInfoDataTable.Rows.Count == 0)
{
errorInfoDataTable.Rows.Add("", result);
}
}
else
{
using (var ts = new TransactionScope(TransactionScopeOption.Required))
{
var updateCount = 0;
var insertCount = 0;
var alreadyCount = 0;
//查詢該機構下所有的監考教師姓名和SID
var proctorDictionary =
ProctorDAL.Instance.GetProctorNameByTestIdAndTestCampusCode(testID, testCampusCode);

foreach (var item in excelData)
{
item.TestID = testID;
//該監考教師是否存在
if (proctorDictionary._ContainsKey(item.Name))
{
item.SID = proctorDictionary[item.Name];
if (ProctorDAL.Instance.Update(item))
updateCount++;
}
}
}
else
{
item.SID = CommonHelper.CreateNewGuid();
if (ProctorDAL.Instance.Add(item))
{
insertCount++;
}
}
}


if (result._IsNullOrEmpty())
{
ts.Complete();
result = string.Format("Excel總條數:{0},更新條數:{1},插入條數:{2},已被編排不能修改條數:{3}", excelData.Count, updateCount,
insertCount,alreadyCount);
}
else
{
errorInfoDataTable.Rows.Add("", result);
}
}
}


return result;

}

//該類處理了excel信息,並返回正確list數據,為上面插入準備數據

public class ImportProctorHelper
{
private const string PROCTOR_SHEET_NAME = "測試";

private string LoadProctors(List<string> testCampusCodeList, XSSFWorkbook xssfworkbook, Action<int, string> showProgress, ref List<Proctor> proctorList, ref Dictionary<int, string> errorInfoDic)
{
var result = string.Empty;
var sheet = xssfworkbook.GetSheet(PROCTOR_SHEET_NAME);
if (sheet == null)
{
return result;
}
//獲取列名(模版中第四行為列名)
var cIndex = 0;
var columnNumber = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //序號
var columntestCampusCode = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //校區代碼(必填)
var columnName = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //監考教師(必填)
var columnProctorType = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //監考類型(必填)
var columnCollege = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //所屬院系(必填)
var columnSeq = LoadCell(sheet, 3, cIndex++).ToString().Trim(); //使用順序
var columnIsUsed = LoadCell(sheet, 3, cIndex).ToString().Trim(); //是否啟用

if (columnNumber == "序號" && columntestCampusCode == "校區代碼(必填)" &&
columnProctorType == "監考類型(必填)" && columnName == "監考教師(必填)" &&
columnCollege == "所屬院系(必填)" && columnSeq == "使用順序(必填)" && columnIsUsed == "是否啟用(必填)")
{
for (var i = 4; i <= sheet.LastRowNum; i++)
{
if (i%1000 == 3)
{
showProgress(30 + i*60/sheet.LastRowNum,
string.Format("讀取excel文件:{0}/{1}", i - 3, sheet.LastRowNum - 3));
}
if (errorInfoDic.Count > 1000)
{
result = "Excel文件錯誤過多,請檢查";
break;
}
cIndex = 1;
var testCampusCode = LoadCell(sheet, i, cIndex++).ToString().Trim(); //校區代碼(必填)
var name = LoadCell(sheet, i, cIndex++).ToString().Trim(); //監考教師(必填)
var proctorType = LoadCell(sheet, i, cIndex++).ToString().Trim(); //監考類型(必填)
var college = LoadCell(sheet, i, cIndex++).ToString().Trim(); //所屬院系(必填)
var seq = LoadCell(sheet, i, cIndex++).ToString().Trim(); //使用順序
var isUsed = LoadCell(sheet, i, cIndex).ToString().Trim(); //是否啟用

//空行不處理
if (testCampusCode._IsNullOrEmpty() &&
name._IsNullOrEmpty() && proctorType._IsNullOrEmpty() &&
college._IsNullOrEmpty() &&
seq._IsNullOrEmpty() &&
isUsed._IsNullOrEmpty()
)
{
continue;
}


//必填欄位
if (!testCampusCode._IsNullOrEmpty() &&
!name._IsNullOrEmpty() && !proctorType._IsNullOrEmpty() && !college._IsNullOrEmpty() &&
!seq._IsNullOrEmpty() &&
!isUsed._IsNullOrEmpty())
{
//檢查校區代碼是否一致
if (!testCampusCodeList.Contains(testCampusCode))
{
errorInfoDic.Add(i + 1,
string.Format("校區代碼不一致,選擇的校區代碼為:{0},Excel中的校區代碼為{1}", testCampusCodeList.First(),
testCampusCode));
continue;
}

if (!Regex.IsMatch(proctorType, @"^[1-2]$"))
{
errorInfoDic.Add(i + 1, "監考類型填寫錯誤");
continue;
}
if (!Regex.IsMatch(seq, @"^[0-9]+$"))
{
errorInfoDic.Add(i + 1, "使用順序填寫錯誤");
continue;
}
if (!Regex.IsMatch(isUsed, @"^[0-1]$"))
{
errorInfoDic.Add(i + 1, "是否啟用填寫錯誤");
continue;
}
if (logExistDicName.ContainsKey(name))
{
errorInfoDic.Add(i + 1, string.Format("第{0}行存在一樣姓名的教師", logExistDicName[name]));
continue;
}
logExistDicName.Add(name, i + 1);

var tmpEntity = new Proctor
{
Name = name,
TestCampusCode = testCampusCode,
ProctorType = int.Parse(proctorType) == 1 ? ProctorType.監考老師一 : ProctorType.監考老師二,
College = college,
Seq = int.Parse(seq),
IsUsed = int.Parse(isUsed) == 0 ? UsedType.未使用 : UsedType.使用
};
proctorList.Add(tmpEntity);
}
else
{
//必填欄位沒填寫
errorInfoDic.Add(i + 1, "必填項未填寫");
}
}
}
else
{
result = "Excel不符合規範,請根據模版中規範填寫數據!";
}

if (result._IsNullOrEmpty() && errorInfoDic.Count > 0)
{
result = "Excel文件存在錯誤,請檢查";
}


return result;
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、在 CentOS 系統中添加 openresty 資源庫sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo 2、安裝 openrestysudo yum install ope ...
  • 線上上閱讀文檔的時候,有沒有想將它抓取到本地,以備沒有網的時候閱讀只需? 先上指令: 你會看到如下的頁面: 過段時間,就會抓取完成,併在本地生成了一個相關聯的目錄。 這個命令就是 wget。它是開發者在Linux下麵非常喜歡使用的下載指令。經常,我們會看到一些技術文檔在指導你下載安裝包的時候,也會用 ...
  • etc etcetera[ɛtsɛtərə]縮寫 等等的意思 放置一些其他文件 ...
  • 介紹: Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYER ...
  • 1.在www.ailiyun.com上下載所需文件以CentOS為例,現將文件下下來 2.兩種掛載方式。 第一種,點旁邊的help文件 按照阿裡的提示完成操作。現將/etc/yum.repos.s/CentOS-Base.repo 備份(相當於更改尾碼名)。 再下載新的CentOS。有可能會提示wg ...
  • 添加命名空間 using System.Xml; 我自己的代碼(添加其中的節點) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("userTable.xml")); XmlNode root = xmlDoc.S ...
  • 2017-04-18 1 public class VisualTargetPresentationSource : PresentationSource 2 { 3 public VisualTargetPresentationSource(HostVisual hostVisual) 4 { 5 ...
  • 上篇博文中我們將模擬設備註冊到Azure IoT Hub中:我們得到了設備的唯一標識。 Azure IoT 技術研究系列2-設備註冊到Azure IoT Hub 本文中我們繼續深入研究,設備到雲、雲到設備通信。 1. 在Azure IoT Hub中接收模擬設備的消息 讀取設備到雲消息的Event H ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...