


C#-Programmierung, Excel-Import und -Export (Quellcode-Download) (Teil 1)
In diesem Artikel wird hauptsächlich der Excel-Import und -Export in C# vorgestellt.
1. Einführung
1.1 Klassenbibliothek von Drittanbietern: NPOI
Beschreibung: NPOI ist die .NET-Version des POI-Projekts und kann für Lese- und Schreibvorgänge in Excel und Word verwendet werden.
Vorteile: Keine Installation der Office-Umgebung erforderlich.
Download-Adresse: http://npoi.codeplex.com/releases
1.2 Einführung in die Excel-Struktur
Arbeitsmappe: Jede Excel-Datei kann als eine Arbeitsmappe verstanden werden.
Blatt: Eine Arbeitsmappe kann mehrere Arbeitsblätter enthalten.
Zeile: Ein Arbeitsblatt (Blatt) kann mehrere Zeilen enthalten.
2. Excel-Import
2.1 Betriebsablauf
2.2 NPOI-Operationscode
Anleitung: Excel-Datei in Liste konvertieren
Schritte:
①Excel-Datei lesen und initialisieren eine Arbeitsmappe (Arbeitsmappe);
② Holen Sie sich ein Arbeitsblatt (Blatt) aus der Arbeitsmappe; der Standardwert ist das erste Arbeitsblatt der Arbeitsmappe;
③ Durchlaufen Sie alle Zeilen (Zeilen) des Arbeitsblatts; Standardmäßig beginnt die Durchquerung in der zweiten Zeile, und die erste Zeile (Seriennummer 0) ist der Zellenkopf.
④ Durchläuft jede Zelle (Zelle) der Zeile gemäß einem bestimmten Wert auf die Eigenschaften von Objekten.
Code:
/// 从Excel2003取数据并记录到List集合里 /// <param name="cellHeard">单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } };</param> /// <param name="filePath">保存文件绝对路径</param> /// <param name="errorMsg">错误信息</param> /// <returns>转换好的List对象集合</returns> private static List<T> Excel2003ToEntityList<T>(Dictionary<string, string> cellHeard, string filePath, out StringBuilder errorMsg) where T : new() { errorMsg = new StringBuilder(); // 错误信息,Excel转换到实体对象时,会有格式的错误信息 List<T> enlist = new List<T>(); // 转换后的集合 List<string> keys = cellHeard.Keys.ToList(); // 要赋值的实体对象属性名称 try { using (FileStream fs = File.OpenRead(filePath)) { HSSFWorkbook workbook = new HSSFWorkbook(fs); HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); // 获取此文件第一个Sheet页 for (int i = 1; i <= sheet.LastRowNum; i++) // 从1开始,第0行为单元头 { // 1.判断当前行是否空行,若空行就不在进行读取下一行操作,结束Excel读取操作 if (sheet.GetRow(i) == null) { break; } T en = new T(); string errStr = ""; // 当前行转换时,是否有错误信息,格式为:第1行数据转换异常:XXX列; for (int j = 0; j < keys.Count; j++) { // 2.若属性头的名称包含'.',就表示是子类里的属性,那么就要遍历子类,eg:UserEn.TrueName if (keys[j].IndexOf(".") >= 0) { // 2.1解析子类属性 string[] properotyArray = keys[j].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries); string subClassName = properotyArray[0]; // '.'前面的为子类的名称 string subClassProperotyName = properotyArray[1]; // '.'后面的为子类的属性名称 System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); // 获取子类的类型 if (subClassInfo != null) { // 2.1.1 获取子类的实例 var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null); // 2.1.2 根据属性名称获取子类里的属性信息 System.Reflection.PropertyInfo properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName); if (properotyInfo != null) { try { // Excel单元格的值转换为对象属性的值,若类型不对,记录出错信息 properotyInfo.SetValue(subClassEn, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null); } catch (Exception e) { if (errStr.Length == 0) { errStr = "第" + i + "行数据转换异常:"; } errStr += cellHeard[keys[j]] + "列;"; } } } } else { // 3.给指定的属性赋值 System.Reflection.PropertyInfo properotyInfo = en.GetType().GetProperty(keys[j]); if (properotyInfo != null) { try { // Excel单元格的值转换为对象属性的值,若类型不对,记录出错信息 properotyInfo.SetValue(en, GetExcelCellToProperty(properotyInfo.PropertyType, sheet.GetRow(i).GetCell(j)), null); } catch (Exception e) { if (errStr.Length == 0) { errStr = "第" + i + "行数据转换异常:"; } errStr += cellHeard[keys[j]] + "列;"; } } } } // 若有错误信息,就添加到错误信息里 if (errStr.Length > 0) { errorMsg.AppendLine(errStr); } enlist.Add(en); } } return enlist; } catch (Exception ex) { throw ex; } }
2.3 Code für logische C#-Operationen
Beschreibung: Führen Sie nachfolgende Operationen an der Excel-konvertierten Liste durch
Schritte:
① Rufen Sie den 2.2-Code auf, um die Excel-Datei in List
② Überprüfen Sie die Gültigkeit von List
③Persistenten Speichervorgang für List
④返回操作结果。
代码:
public void ImportExcel(HttpContext context) { StringBuilder errorMsg = new StringBuilder(); // 错误信息 try { #region 1.获取Excel文件并转换为一个List集合 // 1.1存放Excel文件到本地服务器 HttpPostedFile filePost = context.Request.Files["filed"]; // 获取上传的文件 string filePath = ExcelHelper.SaveExcelFile(filePost); // 保存文件并获取文件路径 // 单元格抬头 // key:实体对象属性名称,可通过反射获取值 // value:属性对应的中文注解 Dictionary<string, string> cellheader = new Dictionary<string, string> { { "Name", "姓名" }, { "Age", "年龄" }, { "GenderName", "性别" }, { "TranscriptsEn.ChineseScores", "语文成绩" }, { "TranscriptsEn.MathScores", "数学成绩" }, }; // 1.2解析文件,存放到一个List集合里 List<UserEntity> enlist = ExcelHelper.ExcelToEntityList<UserEntity>(cellheader, filePath, out errorMsg); #endregion #region 2.对List集合进行有效性校验 #region 2.1检测必填项是否必填 for (int i = 0; i < enlist.Count; i++) { UserEntity en = enlist[i]; string errorMsgStr = "第" + (i + 1) + "行数据检测异常:"; bool isHaveNoInputValue = false; // 是否含有未输入项 if (string.IsNullOrEmpty(en.Name)) { errorMsgStr += "姓名列不能为空;"; isHaveNoInputValue = true; } if (isHaveNoInputValue) // 若必填项有值未填 { en.IsExcelVaildateOK = false; errorMsg.AppendLine(errorMsgStr); } } #endregion #region 2.2检测Excel中是否有重复对象 for (int i = 0; i < enlist.Count; i++) { UserEntity enA = enlist[i]; if (enA.IsExcelVaildateOK == false) // 上面验证不通过,不进行此步验证 { continue; } for (int j = i + 1; j < enlist.Count; j++) { UserEntity enB = enlist[j]; // 判断必填列是否全部重复 if (enA.Name == enB.Name) { enA.IsExcelVaildateOK = false; enB.IsExcelVaildateOK = false; errorMsg.AppendLine("第" + (i + 1) + "行与第" + (j + 1) + "行的必填列重复了"); } } } #endregion // TODO:其他检测 #endregion // 3.TODO:对List集合持久化存储操作。如:存储到数据库 // 4.返回操作结果 bool isSuccess = false; if (errorMsg.Length == 0) { isSuccess = true; // 若错误信息成都为空,表示无错误信息 } var rs = new { success = isSuccess, msg = errorMsg.ToString(), data = enlist }; System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer(); context.Response.ContentType = "text/plain"; context.Response.Write(js.Serialize(rs)); // 返回Json格式的内容 } catch (Exception ex) { throw ex; } }
以上就是C#编程之Excel导入、导出(源码下载) (上)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Leitfaden zu Active Directory mit C#. Hier besprechen wir die Einführung und die Funktionsweise von Active Directory in C# sowie die Syntax und das Beispiel.

Leitfaden zur C#-Serialisierung. Hier besprechen wir die Einführung, die Schritte des C#-Serialisierungsobjekts, die Funktionsweise bzw. das Beispiel.

Leitfaden zum Zufallszahlengenerator in C#. Hier besprechen wir die Funktionsweise des Zufallszahlengenerators, das Konzept von Pseudozufallszahlen und sicheren Zahlen.

Leitfaden zur C#-Datenrasteransicht. Hier diskutieren wir die Beispiele, wie eine Datenrasteransicht aus der SQL-Datenbank oder einer Excel-Datei geladen und exportiert werden kann.

Leitfaden zu Mustern in C#. Hier besprechen wir die Einführung und die drei wichtigsten Arten von Mustern in C# zusammen mit ihren Beispielen und der Code-Implementierung.

Leitfaden zu Primzahlen in C#. Hier besprechen wir die Einführung und Beispiele von Primzahlen in C# sowie die Codeimplementierung.

Leitfaden zur Fakultät in C#. Hier diskutieren wir die Einführung in die Fakultät in C# zusammen mit verschiedenen Beispielen und Code-Implementierungen.

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.
