यह परियोजना .NET फाउंडेशन का हिस्सा है और उनकी आचार संहिता के तहत संचालित होती है।
English | 简体中文 | 繁體中文 | 日本語 | 한국어 | हिन्दी | ไทย | Français | Deutsch | Español | Italiano | Русский | Português | Nederlands | Polski | العربية | فارسی | Türkçe | Tiếng Việt | Bahasa Indonesia
परिचय
MiniExcel .NET के लिए एक सरल और कुशल एक्सेल प्रोसेसिंग टूल है, जिसे विशेष रूप से मेमोरी उपयोग को न्यूनतम करने के लिए डिज़ाइन किया गया है।
वर्तमान में, अधिकांश लोकप्रिय फ्रेमवर्क्स को ऑपरेशन की सुविधा के लिए एक्सेल दस्तावेज़ से सभी डेटा को मेमोरी में लोड करना पड़ता है, लेकिन इससे मेमोरी उपयोग की समस्या हो सकती है। MiniExcel का तरीका अलग है: डेटा को एक-एक पंक्ति स्ट्रीमिंग तरीके से प्रोसेस किया जाता है, जिससे मूल खपत सैकड़ों मेगाबाइट्स से घटकर कुछ मेगाबाइट्स ही रह जाती है, और आउट-ऑफ-मेमोरी (OOM) समस्या प्रभावी रूप से रोकी जा सकती है।
flowchart LR
A1(["Excel analysis
process"]) --> A2{{"Unzipping
XLSX file"}} --> A3{{"Parsing
OpenXML"}} --> A4{{"Model
conversion"}} --> A5(["Output"]) B1(["Other Excel
Frameworks"]) --> B2{{"Memory"}} --> B3{{"Memory"}} --> B4{{"Workbooks &
Worksheets"}} --> B5(["All rows at
the same time"])
C1(["MiniExcel"]) --> C2{{"Stream"}} --> C3{{"Stream"}} --> C4{{"POCO or dynamic"}} --> C5(["Deferred execution
row by row"])
classDef analysis fill:#D0E8FF,stroke:#1E88E5,color:#0D47A1,font-weight:bold;
classDef others fill:#FCE4EC,stroke:#EC407A,color:#880E4F,font-weight:bold;
classDef miniexcel fill:#E8F5E9,stroke:#388E3C,color:#1B5E20,font-weight:bold;
class A1,A2,A3,A4,A5 analysis;
class B1,B2,B3,B4,B5 others;
class C1,C2,C3,C4,C5 miniexcel;
विशेषताएँ
- मेमोरी की खपत को न्यूनतम करता है, जिससे आउट-ऑफ-मेमोरी (OOM) त्रुटियाँ रुकती हैं और पूर्ण गार्बेज कलेक्शन से बचाव होता है
- बड़े डेटा सेट्स पर बेहतर प्रदर्शन के लिए रियल-टाइम, पंक्ति-स्तरीय डेटा संचालन सक्षम करता है
- LINQ के साथ डिफर्ड एक्जीक्यूशन का समर्थन करता है, जिससे तेज़, मेमोरी-कुशल पेजिंग और जटिल क्वेरीज़ संभव होती हैं
- हल्का, जिसमें Microsoft Office या COM+ घटकों की आवश्यकता नहीं है, और DLL आकार 500KB से कम है
- एक्सेल पढ़ने/लिखने/भरने के लिए सरल और सहज API शैली
संस्करण 2.0 पूर्वावलोकन
हम भविष्य के MiniExcel संस्करण पर कार्य कर रहे हैं, जिसमें एक नया मॉड्यूलर और केंद्रित API होगा,
Core और Csv कार्यक्षमताओं के लिए अलग-अलग न्यूगेट पैकेज होंगे, IAsyncEnumerable के माध्यम से असिंक्रोनसली स्ट्रीम्ड क्वेरीज़ का पूरा समर्थन होगा,
और जल्द ही और भी बहुत कुछ आने वाला है! पैकेज प्री-रिलीज़ में उपलब्ध होंगे, तो बेझिझक आज़माएँ और हमें अपनी प्रतिक्रिया दें!
यदि आप ऐसा करते हैं, तो नई दस्तावेज़ीकरण और अपग्रेड नोट्स भी अवश्य देखें।
प्रारंभ करें
- एक्सेल आयात/क्वेरी करें
- एक्सेल निर्यात/बनाएँ
- एक्सेल टेम्प्लेट
- एक्सेल कॉलम नाम/इंडेक्स/इग्नोर एट्रिब्यूट
- उदाहरण
स्थापना
आप पैकेज को NuGet से इंस्टॉल कर सकते हैं
रिलीज़ नोट्स
कृपया रिलीज़ नोट्स देखें
TODO
कृपया देखें TODO
प्रदर्शन
बेंचमार्क के लिए कोड MiniExcel.Benchmarks में पाया जा सकता है।
प्रदर्शन परीक्षण के लिए उपयोग की गई फ़ाइल Test1,000,000x10.xlsx है, जो एक 32MB दस्तावेज़ है जिसमें 1,000,000 पंक्तियाँ * 10 कॉलम हैं, और जिनकी कोशिकाएँ "HelloWorld" स्ट्रिंग से भरी हुई हैं।
सभी बेंचमार्क चलाने के लिए उपयोग करें:
dotnet run -project .\benchmarks\MiniExcel.Benchmarks -c Release -f net9.0 -filter * --join
आप नवीनतम रिलीज़ के लिए बेंचमार्क के परिणाम यहाँ देख सकते हैं।एक्सेल क्वेरी/इम्पोर्ट
#### 1. एक क्वेरी निष्पादित करें और परिणामों को एक स्ट्रॉन्गली टाइप्ड IEnumerable में मैप करें [[अためष्ा प्रयास करें]](https://dotnetfiddle.net/w5WD1J)
बेहतर दक्षता के कारण Stream.Query का उपयोग करने की सिफारिश की जाती है।
public class UserAccount
{
public Guid ID { get; set; }
public string Name { get; set; }
public DateTime BoD { get; set; }
public int Age { get; set; }
public bool VIP { get; set; }
public decimal Points { get; set; }
}var rows = MiniExcel.Query(path);
// or
using (var stream = File.OpenRead(path))
var rows = stream.Query();

#### 2. एक क्वेरी निष्पादित करें और उसे डायनामिक ऑब्जेक्ट्स की सूची में मैप करें बिना हेड का उपयोग किए [[Try it]](https://dotnetfiddle.net/w5WD1J)
- डायनामिक कुंजी है
A.B.C.D..
var rows = MiniExcel.Query(path).ToList();// or
using (var stream = File.OpenRead(path))
{
var rows = stream.Query().ToList();
Assert.Equal("MiniExcel", rows[0].A);
Assert.Equal(1, rows[0].B);
Assert.Equal("Github", rows[1].A);
Assert.Equal(2, rows[1].B);
}
#### 3. पहले हेडर पंक्ति के साथ क्वेरी निष्पादित करें [[इसे आज़माएँ]](https://dotnetfiddle.net/w5WD1J)नोट : एक जैसे कॉलम नाम के लिए दाहिनी ओर वाला अंतिम नाम उपयोग होगा
इनपुट एक्सेल :
| कॉलम1 | कॉलम2 | |-----------|---------| | MiniExcel | 1 | | Github | 2 |
var rows = MiniExcel.Query(useHeaderRow:true).ToList();// or
using (var stream = File.OpenRead(path))
{
var rows = stream.Query(useHeaderRow:true).ToList();
Assert.Equal("MiniExcel", rows[0].Column1);
Assert.Equal(1, rows[0].Column2);
Assert.Equal("Github", rows[1].Column1);
Assert.Equal(2, rows[1].Column2);
}
#### 4. क्वेरी समर्थन LINQ एक्सटेंशन फर्स्ट/टेक/स्किप ...आदिक्वेरी फर्स्ट
var row = MiniExcel.Query(path).First();
Assert.Equal("HelloWorld", row.A);// or
using (var stream = File.OpenRead(path))
{
var row = stream.Query().First();
Assert.Equal("HelloWorld", row.A);
}
MiniExcel/ExcelDataReader/ClosedXML/EPPlus के बीच प्रदर्शन

#### 5. शीट नाम द्वारा क्वेरी करें
MiniExcel.Query(path, sheetName: "SheetName");
//or
stream.Query(sheetName: "SheetName");
#### 6. सभी शीट नाम और पंक्तियों को क्वेरी करेंvar sheetNames = MiniExcel.GetSheetNames(path);
foreach (var sheetName in sheetNames)
{
var rows = MiniExcel.Query(path, sheetName: sheetName);
}
#### 7. कॉलम प्राप्त करेंvar columns = MiniExcel.GetColumns(path); // e.g result : ["A","B"...]var cnt = columns.Count; // get column count
#### 8. डायनामिक क्वेरी में पंक्ति को IDictionary में कास्ट करेंforeach(IDictionary row in MiniExcel.Query(path))
{
//..
}// or
var rows = MiniExcel.Query(path).Cast>();
// or Query specified ranges (capitalized)
// A2 represents the second row of column A, C3 represents the third row of column C
// If you don't want to restrict rows, just don't include numbers
var rows = MiniExcel.QueryRange(path, startCell: "A2", endCell: "C3").Cast>();
#### 9. क्वेरी एक्सेल रिटर्न DataTableसिफारिश नहीं की जाती है, क्योंकि DataTable सभी डेटा को मेमोरी में लोड कर लेगा और MiniExcel की कम मेमोरी खपत की विशेषता खो देगा।
``C#
var table = MiniExcel.QueryAsDataTable(path, useHeaderRow: true);

#### 10. डेटा पढ़ना शुरू करने के लिए सेल निर्दिष्ट करें
csharp MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")
csharp var config = new OpenXmlConfiguration() { FillMergedCells = true }; var rows = MiniExcel.Query(path, configuration: config);मर्ज फिल का उपयोग न करने#### 11. मर्ज की गई कोशिकाएँ भरें
नोट: दक्षता
की तुलना में धीमी हैकारण: OpenXml मानक mergeCells को फाइल के नीचे डालता है, जिससे sheetxml पर दो बार foreach की आवश्यकता होती है

चर लंबाई और चौड़ाई वाली बहु-पंक्ति और स्तंभ भरने का समर्थन करता है

#### 12. डिस्क-बेस कैश द्वारा बड़े फाइल को पढ़ना (Disk-Base Cache - SharedString)
यदि SharedStrings का आकार 5 एमबी से अधिक हो जाता है, तो MiniExcel डिफ़ॉल्ट रूप से स्थानीय डिस्क कैश का उपयोग करेगा, उदाहरण के लिए, 10x100000.xlsx(दस लाख पंक्तियों का डेटा), जब डिस्क कैश अक्षम हो तो अधिकतम मेमोरी उपयोग 195MB है, लेकिन सक्षम डिस्क कैश के साथ केवल 65MB की जरूरत होती है। ध्यान दें, इस अनुकूलन के लिए कुछ दक्षता लागत लगती है, इसलिए इस केस में पढ़ने का समय 7.4 सेकंड से बढ़कर 27.2 सेकंड हो जाएगा। यदि आपको इसकी आवश्यकता नहीं है तो आप निम्न कोड के साथ डिस्क कैश को अक्षम कर सकते हैं:
csharp
var config = new OpenXmlConfiguration { EnableSharedStringCache = false };
MiniExcel.Query(path,configuration: config)
csharp var config = new OpenXmlConfiguration { SharedStringCacheSize=50010241024 }; MiniExcel.Query(path, configuration: config);आपSharedStringCacheSizeका उपयोग करके डिस्क कैशिंग के लिए निर्दिष्ट आकार से अधिक sharedString फ़ाइल का आकार बदल सकते हैं।


एक्सेल बनाएँ/एक्सपोर्ट करें
- एक गैर-सार्वजनिक प्रकार होना चाहिए जिसमें एक सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर हो।
- MiniExcel IEnumerable Deferred Execution को सपोर्ट करता है, यदि आप सबसे कम मेमोरी का उपयोग करना चाहते हैं, तो कृपया ToList जैसे मेथड्स न कॉल करें
उदाहरण : ToList या न करें, मेमोरी का उपयोग

#### 1. अनाम या मजबूत प्रकार [[आजमाएं]](https://dotnetfiddle.net/w5WD1J)
csharp
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
MiniExcel.SaveAs(path, new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
});
csharp var values = new List#### 2.IEnumerable>
csharp MiniExcel.SaveAs(path, reader);फ़ाइल परिणाम बनाएँ :अनुशंसित| कॉलम1 | कॉलम2 | |------------|---------| | MiniExcel | 1 | | Github | 2 |
#### 3. IDataReader
, यह सभी डेटा को मेमोरी में लोड करने से बचा सकता है

DataReader कई शीट्स को निर्यात करता है (Dapper ExecuteReader द्वारा अनुशंसित)
csharp
using (var cnn = Connection)
{
cnn.Open();
var sheets = new Dictionarycsharp var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx"); var table = new DataTable(); { table.Columns.Add("Column1", typeof(string)); table.Columns.Add("Column2", typeof(decimal)); table.Rows.Add("MiniExcel", 1); table.Rows.Add("Github", 2); }#### 4. डाटाटेबलसिफारिश नहीं की जाती, यह सभी डेटा को मेमोरी में लोड कर देगाडाटाटेबल पहले कॉलम नाम के लिए कैप्शन का उपयोग करता है, फिर कॉलम नाम का उपयोग करता है
MiniExcel.SaveAs(path, table);
csharp using (var connection = GetConnection(connectionString)) { var rows = connection.Query( new CommandDefinition( @"select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2" , flags: CommandFlags.NoCache) ); // Note: QueryAsync will throw close connection exception MiniExcel.SaveAs(path, rows); }#### 5. Dapper क्वेरीCommandDefinition + CommandFlags.NoCacheधन्यवाद @shaofing #552, कृपया
का उपयोग करें
नीचे दिया गया कोड सभी डेटा को मेमोरी में लोड कर देगाcsharp
using (var connection = GetConnection(connectionString))
{
var rows = connection.Query(@"select 'MiniExcel' as Column1,1 as Column2 union all select 'Github',2");
MiniExcel.SaveAs(path, rows);
}
#### 6. मेमोरीस्ट्रीम में SaveAs [[प्रयास करें]](https://dotnetfiddle.net/JOen0e)
csharp
using (var stream = new MemoryStream()) //support FileStream,MemoryStream ect.
{
stream.SaveAs(values);
}
उदा : एक्सेल निर्यात के लिए एपीआई csharp
public IActionResult DownloadExcel()
{
var values = new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
};var memoryStream = new MemoryStream(); memoryStream.SaveAs(values); memoryStream.Seek(0, SeekOrigin.Begin); return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = "demo.xlsx" }; }
#### 7. कई शीट्स बनाएं
csharp
// 1. Dictionary// 2. DataSet var sheets = new DataSet(); sheets.Add(UsersDataTable); sheets.Add(DepartmentDataTable); //.. MiniExcel.SaveAs(path, sheets);

#### 8. टेबलस्टाइल्स विकल्प
डिफ़ॉल्ट स्टाइल

स्टाइल कॉन्फ़िगरेशन के बिना
csharp
var config = new OpenXmlConfiguration()
{
TableStyles = TableStyles.None
};
MiniExcel.SaveAs(path, value,configuration:config);
csharp MiniExcel.SaveAs(path, value, configuration: new OpenXmlConfiguration() { AutoFilter = false });OpenXmlConfiguration.AutoFilter#### 9. ऑटोफ़िल्टर
v0.19.0 से
ऑटोफ़िल्टर को सक्षम/अक्षम कर सकता है, डिफ़ॉल्ट मानtrueहै, और ऑटोफ़िल्टर सेट करने का तरीका:
#### 10. छवि बनाएं
csharp
var value = new[] {
new { Name="github",Image=File.ReadAllBytes(PathHelper.GetFile("images/github_logo.png"))},
new { Name="google",Image=File.ReadAllBytes(PathHelper.GetFile("images/google_logo.png"))},
new { Name="microsoft",Image=File.ReadAllBytes(PathHelper.GetFile("images/microsoft_logo.png"))},
new { Name="reddit",Image=File.ReadAllBytes(PathHelper.GetFile("images/reddit_logo.png"))},
new { Name="statck_overflow",Image=File.ReadAllBytes(PathHelper.GetFile("images/statck_overflow_logo.png"))},
};
MiniExcel.SaveAs(path, value);
csharp var mergedFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid().ToString()}.xlsx");byte[]#### 11. बाइट एरे फ़ाइल निर्यात
संस्करण 1.22.0 से, जब मान का प्रकार
होता है, तो सिस्टम डिफ़ॉल्ट रूप से सेल में फ़ाइल पथ को सहेजता है, और आयात करते समय सिस्टम इसेbyte[]में परिवर्तित कर सकता है। और यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आपOpenXmlConfiguration.EnableConvertByteArrayकोfalseपर सेट कर सकते हैं, इससे सिस्टम की दक्षता में सुधार हो सकता है।byte[]
संस्करण 1.22.0 से, जब मान का प्रकार
होता है, तो सिस्टम डिफ़ॉल्ट रूप से सेल में फ़ाइल पथ को सहेजता है, और आयात करते समय सिस्टम इसेbyte[]में परिवर्तित कर सकता है। और यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आपOpenXmlConfiguration.EnableConvertByteArrayकोfalseपर सेट कर सकते हैं, इससे सिस्टम की दक्षता में सुधार हो सकता है।xlsx
#### 12. एक जैसे सेल को लंबवत मर्ज करें
यह सुविधा केवल
प्रारूप में समर्थित है और @merge तथा @endmerge टैग्स के बीच सेल्स को लंबवत रूप से मर्ज करती है। आप @mergelimit का उपयोग करके सेल्स के लंबवत मर्ज की सीमा निर्धारित कर सकते हैं।
var path = @"../../../../../samples/xlsx/TestMergeWithTag.xlsx";
MiniExcel.MergeSameCells(mergedFilePath, path);
csharp
var memoryStream = new MemoryStream();var path = @"../../../../../samples/xlsx/TestMergeWithTag.xlsx";
memoryStream.MergeSameCells(path);
मर्ज से पहले और बाद की फ़ाइल सामग्री:मर्ज सीमा के बिना:


मर्ज सीमा के साथ:


#### 13. नल मान छोड़ें
नल मानों के लिए खाली सेल लिखने का नया स्पष्ट विकल्प:
csharp
DataTable dt = new DataTable();/ ... /
DataRow dr = dt.NewRow();
dr["Name1"] = "Somebody once"; dr["Name2"] = null; dr["Name3"] = "told me.";
dt.Rows.Add(dr);
OpenXmlConfiguration configuration = new OpenXmlConfiguration() { EnableWriteNullValueCell = true // Default value. };
MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt, configuration: configuration);

xml
पिछला व्यवहार:csharp
/ ... /OpenXmlConfiguration configuration = new OpenXmlConfiguration() { EnableWriteNullValueCell = false // Default value is true. };
MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt, configuration: configuration);

xml
शून्य और DBNull मानों के लिए कार्य करता है।#### 14. पैन को फ्रीज करें
csharp
/ ... /OpenXmlConfiguration configuration = new OpenXmlConfiguration() { FreezeRowCount = 1, // default is 1 FreezeColumnCount = 2 // default is 0 };
MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt, configuration: configuration);
csharp // 1. By POCO var value = new { Name = "Jack", CreateDate = new DateTime(2021, 01, 01), VIP = true, Points = 123 }; MiniExcel.SaveAsByTemplate(path, templatePath, value);{{variable name}}एक्सेल टेम्पलेट में डेटा भरें
- डिक्लेरेशन Vue टेम्पलेट
के समान है, या कलेक्शन रेंडरिंग{{collection name.field name}}कलेक्शन रेंडरिंग IEnumerable/DataTable/DapperRow को सपोर्ट करता है #### 1. बेसिक फिल
टेम्पलेट:
परिणाम:
कोड:
// 2. By Dictionary
var value = new Dictionary#### 2. IEnumerable डेटा भरना
नोट1: सूची भरने के लिए समान कॉलम के पहले IEnumerable का उपयोग आधार के रूप में करें
टेम्पलेट:

परिणाम:

कोड:
csharp //1. By POCO var value = new { employees = new[] { new {name="Jack",department="HR"}, new {name="Lisa",department="HR"}, new {name="John",department="HR"}, new {name="Mike",department="IT"}, new {name="Neo",department="IT"}, new {name="Loan",department="IT"} } }; MiniExcel.SaveAsByTemplate(path, templatePath, value);
//2. By Dictionary
var value = new Dictionary#### 3. जटिल डेटा भरना
नोट: मल्टी-शीट्स का समर्थन करता है और एक ही वेरिएबल का उपयोग करता है
टेम्पलेट:

परिणाम:

csharp // 1. By POCO var value = new { title = "FooCompany", managers = new[] { new {name="Jack",department="HR"}, new {name="Loan",department="IT"} }, employees = new[] { new {name="Wade",department="HR"}, new {name="Felix",department="HR"}, new {name="Eric",department="IT"}, new {name="Keaton",department="IT"} } }; MiniExcel.SaveAsByTemplate(path, templatePath, value);
// 2. By Dictionary
var value = new Dictionary#### 4. बिग डेटा प्रदर्शन भरें
नोट: IEnumerable डिफर्ड एक्जीक्यूशन का उपयोग करना, न कि ToList, MiniExcel में अधिकतम मेमोरी उपयोग को बचा सकता है

#### 5. सेल वैल्यू ऑटो मैपिंग प्रकार
टेम्पलेट

परिणाम

क्लास
csharp public class Poco { public string @string { get; set; } public int? @int { get; set; } public decimal? @decimal { get; set; } public double? @double { get; set; } public DateTime? datetime { get; set; } public bool? @bool { get; set; } public Guid? Guid { get; set; } }
कोडcsharp
var poco = new TestIEnumerableTypePoco { @string = "string", @int = 123, @decimal = decimal.Parse("123.45"), @double = (double)123.33, @datetime = new DateTime(2021, 4, 1), @bool = true, @Guid = Guid.NewGuid() };
var value = new
{
Ts = new[] {
poco,
new TestIEnumerableTypePoco{},
null,
poco
}
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);
#### 6. उदाहरण : Github प्रोजेक्ट्स की सूची बनानाटेम्पलेट

परिणाम

कोड
csharp
var projects = new[]
{
new {Name = "MiniExcel",Link="https://github.com/mini-software/MiniExcel",Star=146, CreateTime=new DateTime(2021,03,01)},
new {Name = "HtmlTableHelper",Link="https://github.com/mini-software/HtmlTableHelper",Star=16, CreateTime=new DateTime(2020,02,01)},
new {Name = "PocoClassGenerator",Link="https://github.com/mini-software/PocoClassGenerator",Star=16, CreateTime=new DateTime(2019,03,17)}
};
var value = new
{
User = "ITWeiHan",
Projects = projects,
TotalStar = projects.Sum(s => s.Star)
};
MiniExcel.SaveAsByTemplate(path, templatePath, value);
#### 7. समूहित डेटा भरेंcsharp
var value = new Dictionarycsharp @if(name == Jack) {{employees.name}} @elseif(name == Neo) Test {{employees.name}} @else {{employees.department}} @endif##### 1.@groupटैग के साथ और@headerटैग के साथपूर्व
बाद
##### 2. @group टैग के साथ और @header टैग के बिना
पूर्व
बाद
##### 3. @group टैग के बिना
पूर्व
बाद
#### 8. सेल के अंदर If/ElseIf/Else स्टेटमेंट्स
नियम:
- DateTime, Double, Int के लिए ==, !=, >, >=, <, <= ऑपरेटर का समर्थन करता है।
- String के लिए ==, != ऑपरेटर का समर्थन करता है।
- प्रत्येक स्टेटमेंट नई पंक्ति में होनी चाहिए।
- ऑपरेटर के पहले और बाद में एक स्पेस होना चाहिए।
- स्टेटमेंट्स के अंदर कोई नई पंक्ति नहीं होनी चाहिए।
- सेल ठीक नीचे दिए गए प्रारूप में होनी चाहिए।
पहले
बाद में

#### 9. DataTable को पैरामीटर के रूप में
csharp
var managers = new DataTable();
{
managers.Columns.Add("name");
managers.Columns.Add("department");
managers.Rows.Add("Jack", "HR");
managers.Rows.Add("Loan", "IT");
}
var value = new Dictionarycsharp var config = new OpenXmlConfiguration() { IgnoreTemplateParameterMissing = false, }; MiniExcel.SaveAsByTemplate(path, templatePath, value, config)#### 10. सूत्र$##### 1. उदाहरण अपने सूत्र के आगे
लगाएँ और संदर्भित श्रेणी की शुरुआत और अंत की पंक्तियों को चिह्नित करने के लिए$enumrowstartऔर$enumrowendका उपयोग करें:$
जब टेम्पलेट को रेंडर किया जाता है, तो
उपसर्ग हटा दिया जाएगा और$enumrowstartतथा$enumrowendको गिनने योग्य श्रेणी की शुरुआत और अंत की पंक्ति संख्याओं से बदल दिया जाएगा:$=SUM(C{{$enumrowstart}}:C{{$enumrowend}})
##### 2. अन्य उदाहरण सूत्र:
| | | |--------------|-------------------------------------------------------------------------------------------| | योग |
| | वैकल्पिक औसत |$=SUM(C{{$enumrowstart}}:C{{$enumrowend}}) / COUNT(C{{$enumrowstart}}:C{{$enumrowend}})| | श्रेणी |$=MAX(C{{$enumrowstart}}:C{{$enumrowend}}) - MIN(C{{$enumrowstart}}:C{{$enumrowend}})|IgnoreTemplateParameterMissing#### 11. अन्य
##### 1. टेम्पलेट पैरामीटर कुंजी की जांच
V1.24.0 से, डिफ़ॉल्ट रूप से टेम्पलेट में गायब पैरामीटर कुंजी को अनदेखा कर दिया जाता है और उसे खाली स्ट्रिंग से बदल दिया जाता है,
अपवाद फेंकने को नियंत्रित कर सकता है या नहीं।

एक्सेल कॉलम नाम/इंडेक्स/इग्नोर एट्रिब्यूट
#### 1. कॉलम नाम, कॉलम इंडेक्स, कॉलम इग्नोर निर्दिष्ट करें
एक्सेल उदाहरण

कोड
csharp
public class ExcelAttributeDemo
{
[ExcelColumnName("Column1")]
public string Test1 { get; set; }
[ExcelColumnName("Column2")]
public string Test2 { get; set; }
[ExcelIgnore]
public string Test3 { get; set; }
[ExcelColumnIndex("I")] // system will convert "I" to 8 index
public string Test4 { get; set; }
public string Test5 { get; } //wihout set will ignore
public string Test6 { get; private set; } //un-public set will ignore
[ExcelColumnIndex(3)] // start with 0
public string Test7 { get; set; }
}var rows = MiniExcel.Query
#### 2. कस्टम प्रारूप (ExcelFormatAttribute)
V0.21.0 से समर्थन वर्ग जिसमें ToString(string content) मेथड प्रारूप है
कक्षा
csharp public class Dto { public string Name { get; set; }
[ExcelFormat("MMMM dd, yyyy")] public DateTime InDate { get; set; } }
कोडcsharp
var value = new Dto[] {
new Issue241Dto{ Name="Jack",InDate=new DateTime(2021,01,04)},
new Issue241Dto{ Name="Henry",InDate=new DateTime(2020,04,05)},
};
MiniExcel.SaveAs(path, value);
परिणाम
क्वेरी कस्टम फ़ॉर्मेट रूपांतरण को सपोर्ट करती है

#### 3. कॉलम चौड़ाई सेट करें (ExcelColumnWidthAttribute)
csharp
public class Dto
{
[ExcelColumnWidth(20)]
public int ID { get; set; }
[ExcelColumnWidth(15.50)]
public string Name { get; set; }
}
#### 4. कई कॉलम नामों का एक ही प्रॉपर्टी से मैप होना।csharp
public class Dto
{
[ExcelColumnName(excelColumnName:"EmployeeNo",aliases:new[] { "EmpNo","No" })]
public string Empno { get; set; }
public string Name { get; set; }
}
#### 5. System.ComponentModel.DisplayNameAttribute = ExcelColumnName.excelColumnNameAttribute
संस्करण 1.24.0 से, सिस्टम System.ComponentModel.DisplayNameAttribute = ExcelColumnName.excelColumnNameAttribute का समर्थन करता है
C#
public class TestIssueI4TXGTDto
{
public int ID { get; set; }
public string Name { get; set; }
[DisplayName("Specification")]
public string Spc { get; set; }
[DisplayName("Unit Price")]
public decimal Up { get; set; }
}
#### 6. ExcelColumnAttributeV1.26.0 से, कई विशेषताओं को इस प्रकार सरल बनाया जा सकता है :
csharp
public class TestIssueI4ZYUUDto
{
[ExcelColumn(Name = "ID",Index =0)]
public string MyProperty { get; set; }
[ExcelColumn(Name = "CreateDate", Index = 1,Format ="yyyy-MM",Width =100)]
public DateTime MyProperty2 { get; set; }
}
#### 7. DynamicColumnAttributeV1.26.0 से, हम Column की विशेषताओं को डायनामिक रूप से सेट कर सकते हैं
csharp
var config = new OpenXmlConfiguration
{
DynamicColumns = new DynamicExcelColumn[] {
new DynamicExcelColumn("id"){Ignore=true},
new DynamicExcelColumn("name"){Index=1,Width=10},
new DynamicExcelColumn("createdate"){Index=0,Format="yyyy-MM-dd",Width=15},
new DynamicExcelColumn("point"){Index=2,Name="Account Point"},
}
};
var path = PathHelper.GetTempPath();
var value = new[] { new { id = 1, name = "Jack", createdate = new DateTime(2022, 04, 12) ,point = 123.456} };
MiniExcel.SaveAs(path, value, configuration: config);

#### 8. डायनामिकशीटएट्रीब्यूट
V1.31.4 से हम शीट की विशेषताएँ डायनामिक रूप से सेट कर सकते हैं। हम शीट का नाम और स्थिति (दृश्यता) सेट कर सकते हैं।
csharp
var configuration = new OpenXmlConfiguration
{
DynamicSheets = new DynamicExcelSheet[] {
new DynamicExcelSheet("usersSheet") { Name = "Users", State = SheetState.Visible },
new DynamicExcelSheet("departmentSheet") { Name = "Departments", State = SheetState.Hidden }
}
}; var users = new[] { new { Name = "Jack", Age = 25 }, new { Name = "Mike", Age = 44 } };
var department = new[] { new { ID = "01", Name = "HR" }, new { ID = "02", Name = "IT" } };
var sheets = new Dictionary
var path = PathHelper.GetTempPath(); MiniExcel.SaveAs(path, sheets, configuration: configuration);
हम नए गुण ExcelSheetAttribute का भी उपयोग कर सकते हैं:C#
[ExcelSheet(Name = "Departments", State = SheetState.Hidden)]
private class DepartmentDto
{
[ExcelColumn(Name = "ID",Index = 0)]
public string ID { get; set; }
[ExcelColumn(Name = "Name",Index = 1)]
public string Name { get; set; }
}
### जोड़ें, हटाएं, अपडेट करें#### जोड़ें
v1.28.0 अब CSV में अंतिम पंक्ति के बाद N पंक्तियों का डाटा जोड़ने का समर्थन करता है
csharp
// Origin
{
var value = new[] {
new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)},
new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)},
};
MiniExcel.SaveAs(path, value);
}
// Insert 1 rows after last
{
var value = new { ID=3,Name = "Mike", InDate = new DateTime(2021, 04, 23) };
MiniExcel.Insert(path, value);
}
// Insert N rows after last
{
var value = new[] {
new { ID=4,Name ="Frank",InDate=new DateTime(2021,06,07)},
new { ID=5,Name ="Gloria",InDate=new DateTime(2022,05,03)},
};
MiniExcel.Insert(path, value);
}

v1.37.0 समर्थन करता है कि एक्सेल में मौजूदा वर्कबुक में एक नया शीट डाली जा सकती है
csharp
// Origin excel
{
var value = new[] {
new { ID=1,Name ="Jack",InDate=new DateTime(2021,01,03)},
new { ID=2,Name ="Henry",InDate=new DateTime(2020,05,03)},
};
MiniExcel.SaveAs(path, value, sheetName: "Sheet1");
}
// Insert a new sheet
{
var value = new { ID=3,Name = "Mike", InDate = new DateTime(2021, 04, 23) };
MiniExcel.Insert(path, table, sheetName: "Sheet2");
}
csharp stream.SaveAs(excelType:ExcelType.CSV); //or stream.SaveAs(excelType:ExcelType.XLSX); //or stream.Query(excelType:ExcelType.CSV); //or stream.Query(excelType:ExcelType.XLSX);#### हटाएं(प्रतीक्षा में)फाइल एक्सटेंशन#### अपडेट(प्रतीक्षा में)
एक्सेल प्रकार ऑटो चेक
- MiniExcel डिफ़ॉल्ट रूप से
के आधार पर जांचेगा कि यह xlsx है या csv, लेकिन इसमें गलतियां हो सकती हैं, कृपया इसे मैन्युअल रूप से निर्दिष्ट करें।स्ट्रीम से यह पता नहीं लगाया जा सकता कि वह किस एक्सेल से है, कृपया इसे मैन्युअल रूप से निर्दिष्ट करें।
csharp var config = new MiniExcelLibs.Csv.CsvConfiguration() { Seperator=';' }; MiniExcel.SaveAs(path, values,configuration: config);stringसीएसवी
#### नोट
- डिफ़ॉल्ट रूप से रिटर्न किया गया प्रकार
होता है, और मान को नंबर या दिनांक में परिवर्तित नहीं किया जाएगा, जब तक कि प्रकार को स्ट्रॉन्ग टाइपिंग जेनेरिक द्वारा परिभाषित न किया गया हो।,#### कस्टम सेपरेटर
डिफ़ॉल्ट रूप से सेपरेटर
होता है, आप कस्टमाइज़ेशन के लिएSeperatorप्रॉपर्टी को संशोधित कर सकते हैं।
V1.30.1 से कस्टम सेपरेटर के लिए फंक्शन का समर्थन किया गया है (धन्यवाद @hyzx86)csharp
var config = new CsvConfiguration()
{
SplitFn = (row) => Regex.Split(row, $"\"" target="_blank" rel="noopener noreferrer">\t,$)")
.Select(s => Regex.Replace(s.Replace("\"\"", "\""), "^\"|\"$", "")).ToArray()
};
var rows = MiniExcel.Query(path, configuration: config).ToList();
csharp var config = new MiniExcelLibs.Csv.CsvConfiguration() { NewLine='\n' }; MiniExcel.SaveAs(path, values,configuration: config);#### कस्टम लाइन ब्रेक\r\nडिफ़ॉल्ट रूप से
न्यूलाइन कैरेक्टर है, आप अनुकूलन के लिएNewLineप्रॉपर्टी को संशोधित कर सकते हैं
#### कस्टम कोडिंग- डिफ़ॉल्ट एन्कोडिंग "बाइट ऑर्डर मार्क्स से एन्कोडिंग का पता लगाएं" है (detectEncodingFromByteOrderMarks: true)
- यदि आपकी कोई कस्टम एन्कोडिंग आवश्यकताएँ हैं, तो कृपया StreamReaderFunc / StreamWriterFunc प्रॉपर्टी को संशोधित करें
csharp
// Read
var config = new MiniExcelLibs.Csv.CsvConfiguration()
{
StreamReaderFunc = (stream) => new StreamReader(stream,Encoding.GetEncoding("gb2312"))
};
var rows = MiniExcel.Query(path, true,excelType:ExcelType.CSV,configuration: config);// Write var config = new MiniExcelLibs.Csv.CsvConfiguration() { StreamWriterFunc = (stream) => new StreamWriter(stream, Encoding.GetEncoding("gb2312")) }; MiniExcel.SaveAs(path, value,excelType:ExcelType.CSV, configuration: config);
#### खाली स्ट्रिंग को null के रूप में पढ़ेंडिफ़ॉल्ट रूप से, खाली मान string.Empty में मैप किए जाते हैं। आप इस व्यवहार को बदल सकते हैं
csharp
var config = new MiniExcelLibs.Csv.CsvConfiguration()
{
ReadEmptyStringAsNull = true
};
### डेटा रीडर#### 1. गेटरीडर
संस्करण 1.23.0 से, आप GetDataReader का उपयोग कर सकते हैं
csharp
using (var reader = MiniExcel.GetReader(path,true))
{
while (reader.Read())
{
for (int i = 0; i < reader.FieldCount; i++)
{
var value = reader.GetValue(i);
}
}
}
### असिंक- v0.17.0 असिंक का समर्थन करता है (धन्यवाद isdaniel ( SHIH,BING-SIOU)](https://github.com/isdaniel))
csharp
public static Task SaveAsAsync(string path, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.UNKNOWN, IConfiguration configuration = null)
public static Task SaveAsAsync(this Stream stream, object value, bool printHeader = true, string sheetName = "Sheet1", ExcelType excelType = ExcelType.XLSX, IConfiguration configuration = null)
public static Taskcsharp public class Dto { public string Name { get; set; } public I49RYZUserType UserType { get; set; } }- v1.25.0 मेंcancellationTokenका समर्थन है।अन्य
#### 1. एनम
सुनिश्चित करें कि एक्सेल और प्रॉपर्टी का नाम एक जैसा हो, सिस्टम स्वतः मैपिंग करेगा (केस असंवेदनशील)
V0.18.0 से एनम विवरण का समर्थन है
public enum Type { [Description("General User")] V1, [Description("General Administrator")] V2, [Description("Super Administrator")] V3 }

चूंकि 1.30.0 संस्करण से Excel Description को Enum में सपोर्ट किया गया है, धन्यवाद @KaneLeung
#### 2. CSV को XLSX में कनवर्ट करें या XLSX को CSV में कनवर्ट करें
csharp
MiniExcel.ConvertXlsxToCsv(xlsxPath, csvPath);
MiniExcel.ConvertXlsxToCsv(xlsxStream, csvStream);
MiniExcel.ConvertCsvToXlsx(csvPath, xlsxPath);
MiniExcel.ConvertCsvToXlsx(csvStream, xlsxStream);
#### 3. कस्टम CultureInfo`csharp using (var excelStream = new FileStream(path: filePath, FileMode.Open, FileAccess.Read)) using (var csvStream = new MemoryStream()) { MiniExcel.ConvertXlsxToCsv(excelStream, csvStream); }
संस्करण 1.22.0 से, आप नीचे दिए गए तरीके से कस्टम CultureInfo बना सकते हैं, सिस्टम डिफ़ॉल्ट CultureInfo.InvariantCulture है।
var config = new CsvConfiguration()
{
Culture = new CultureInfo("fr-FR"),
};
MiniExcel.SaveAs(path, value, configuration: config);// or
MiniExcel.Query(path, configuration: config);
#### 4. कस्टम बफर आकार public abstract class Configuration : IConfiguration
{
public int BufferSize { get; set; } = 1024 * 512;
}
#### 5. फास्टमोडसिस्टम मेमोरी को नियंत्रित नहीं करेगा, लेकिन आप तेज़ सेव स्पीड प्राप्त कर सकते हैं।
var config = new OpenXmlConfiguration() { FastMode = true };
MiniExcel.SaveAs(path, reader,configuration:config);
#### 6. बैच में चित्र जोड़ें (MiniExcel.AddPicture)कृपया बैच में पंक्तियों का डेटा उत्पन्न करने से पहले चित्र जोड़ें, अन्यथा AddPicture को कॉल करते समय सिस्टम अधिक मेमोरी का उपयोग करेगा।
var images = new[]
{
new MiniExcelPicture
{
ImageBytes = File.ReadAllBytes(PathHelper.GetFile("images/github_logo.png")),
SheetName = null, // default null is first sheet
CellAddress = "C3", // required
},
new MiniExcelPicture
{
ImageBytes = File.ReadAllBytes(PathHelper.GetFile("images/google_logo.png")),
PictureType = "image/png", // default PictureType = image/png
SheetName = "Demo",
CellAddress = "C9", // required
WidthPx = 100,
HeightPx = 100,
},
};
MiniExcel.AddPicture(path, images);
#### 7. शीट्स का आयाम प्राप्त करें
var dim = MiniExcel.GetSheetDimensions(path);
उदाहरण:
#### 1. SQLite और Dapper बड़े आकार की फ़ाइल SQL इन्सर्ट में OOM से बचाव
नोट : कृपया Query के बाद ToList/ToArray मेथड्स को न बुलाएँ, इससे सारा डेटा मेमोरी में लोड हो जाएगा
using (var connection = new SQLiteConnection(connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
using (var stream = File.OpenRead(path))
{
var rows = stream.Query();
foreach (var row in rows)
connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction);
transaction.Commit();
}
}
प्रदर्शन:

#### 2. ASP.NET Core 3.1 या MVC 5 में एक्सेल Xlsx डाउनलोड/अपलोड API डेमो इसे आज़माएँ
public class ApiController : Controller
{
public IActionResult Index()
{
return new ContentResult
{
ContentType = "text/html",
StatusCode = (int)HttpStatusCode.OK,
Content = @"
DownloadExcel
DownloadExcelFromTemplatePath
DownloadExcelFromTemplateBytes
Upload Excel
public IActionResult DownloadExcel()
{
var values = new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
};
var memoryStream = new MemoryStream();
memoryStream.SaveAs(values);
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "demo.xlsx"
};
}
public IActionResult DownloadExcelFromTemplatePath()
{
string templatePath = "TestTemplateComplex.xlsx";
Dictionary value = new Dictionary()
{
["title"] = "FooCompany",
["managers"] = new[] {
new {name="Jack",department="HR"},
new {name="Loan",department="IT"}
},
["employees"] = new[] {
new {name="Wade",department="HR"},
new {name="Felix",department="HR"},
new {name="Eric",department="IT"},
new {name="Keaton",department="IT"}
}
};
MemoryStream memoryStream = new MemoryStream();
memoryStream.SaveAsByTemplate(templatePath, value);
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "demo.xlsx"
};
}
private static Dictionary TemplateBytesCache = new Dictionary();
static ApiController()
{
string templatePath = "TestTemplateComplex.xlsx";
byte[] bytes = System.IO.File.ReadAllBytes(templatePath);
TemplateBytesCache.Add(templatePath, bytes);
}
public IActionResult DownloadExcelFromTemplateBytes()
{
byte[] bytes = TemplateBytesCache["TestTemplateComplex.xlsx"];
Dictionary value = new Dictionary()
{
["title"] = "FooCompany",
["managers"] = new[] {
new {name="Jack",department="HR"},
new {name="Loan",department="IT"}
},
["employees"] = new[] {
new {name="Wade",department="HR"},
new {name="Felix",department="HR"},
new {name="Eric",department="IT"},
new {name="Keaton",department="IT"}
}
};
MemoryStream memoryStream = new MemoryStream();
memoryStream.SaveAsByTemplate(bytes, value);
memoryStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "demo.xlsx"
};
}
public IActionResult UploadExcel(IFormFile excel)
{
var stream = new MemoryStream();
excel.CopyTo(stream);
foreach (var item in stream.Query(true))
{
// do your logic etc.
}
return Ok("File uploaded successfully");
}
}
#### 3. पेजिंग क्वेरीvoid Main()
{
var rows = MiniExcel.Query(path); Console.WriteLine("==== No.1 Page ====");
Console.WriteLine(Page(rows,pageSize:3,page:1));
Console.WriteLine("==== No.50 Page ====");
Console.WriteLine(Page(rows,pageSize:3,page:50));
Console.WriteLine("==== No.5000 Page ====");
Console.WriteLine(Page(rows,pageSize:3,page:5000));
}
public static IEnumerable Page(IEnumerable en, int pageSize, int page)
{
return en.Skip(page * pageSize).Take(pageSize);
}

#### 4. मेमोरीस्ट्रीम द्वारा WebForm एक्सेल निर्यात करें
var fileName = "Demo.xlsx";
var sheetName = "Sheet1";
HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("Content-Disposition", $"attachment;filename=\"{fileName}\"");
var values = new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
};
var memoryStream = new MemoryStream();
memoryStream.SaveAs(values, sheetName: sheetName);
memoryStream.Seek(0, SeekOrigin.Begin);
memoryStream.CopyTo(Response.OutputStream);
response.End();
#### 5. डायनामिक i18n मल्टी-लैंग्वेज और रोल अथॉरिटी प्रबंधनउदाहरण की तरह, i18n और परमिशन मैनेजमेंट को संभालने के लिए एक मेथड बनाएं, और डायनामिक तथा कम मेमोरी प्रोसेसिंग प्रभाव प्राप्त करने के लिए yield return to return IEnumerable का उपयोग करें
void Main()
{
var value = new Order[] {
new Order(){OrderNo = "SO01",CustomerID="C001",ProductID="P001",Qty=100,Amt=500},
new Order(){OrderNo = "SO02",CustomerID="C002",ProductID="P002",Qty=300,Amt=400},
}; Console.WriteLine("en-Us and Sales role");
{
var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx";
var lang = "en-US";
var role = "Sales";
MiniExcel.SaveAs(path, GetOrders(lang, role, value));
MiniExcel.Query(path, true).Dump();
}
Console.WriteLine("zh-CN and PMC role");
{
var path = Path.GetTempPath() + Guid.NewGuid() + ".xlsx";
var lang = "zh-CN";
var role = "PMC";
MiniExcel.SaveAs(path, GetOrders(lang, role, value));
MiniExcel.Query(path, true).Dump();
}
}
private IEnumerable> GetOrders(string lang, string role, Order[] orders)
{
foreach (var order in orders)
{
var newOrder = new Dictionary();
if (lang == "zh-CN")
{
newOrder.Add("客户编号", order.CustomerID);
newOrder.Add("订单编号", order.OrderNo);
newOrder.Add("产品编号", order.ProductID);
newOrder.Add("数量", order.Qty);
if (role == "Sales")
newOrder.Add("价格", order.Amt);
yield return newOrder;
}
else if (lang == "en-US")
{
newOrder.Add("Customer ID", order.CustomerID);
newOrder.Add("Order No", order.OrderNo);
newOrder.Add("Product ID", order.ProductID);
newOrder.Add("Quantity", order.Qty);
if (role == "Sales")
newOrder.Add("Amount", order.Amt);
yield return newOrder;
}
else
{
throw new InvalidDataException($"lang {lang} wrong");
}
}
}
public class Order
{
public string OrderNo { get; set; }
public string CustomerID { get; set; }
public decimal Qty { get; set; }
public string ProductID { get; set; }
public decimal Amt { get; set; }
}

अक्सर पूछे जाने वाले प्रश्न (FAQ)
#### प्रश्न: यदि Excel हेडर शीर्षक क्लास प्रॉपर्टी नाम के बराबर नहीं है, तो मैपिंग कैसे करें?
उत्तर: कृपया ExcelColumnName एट्रिब्यूट का उपयोग करें

#### प्रश्न: एक साथ कई शीट्स को कैसे क्वेरी या एक्सपोर्ट करें?
उत्तर: GetSheetNames मेथड का उपयोग करें, साथ में Query के sheetName पैरामीटर के साथ।
var sheets = MiniExcel.GetSheetNames(path);
foreach (var sheet in sheets)
{
Console.WriteLine($"sheet name : {sheet} ");
var rows = MiniExcel.Query(path,useHeaderRow:true,sheetName:sheet);
Console.WriteLine(rows);
}

#### प्रश्न: शीट की दृश्यता के बारे में जानकारी कैसे प्राप्त करें या एक्सपोर्ट करें?
उत्तर: GetSheetInformations विधि।
var sheets = MiniExcel.GetSheetInformations(path);
foreach (var sheetInfo in sheets)
{
Console.WriteLine($"sheet index : {sheetInfo.Index} "); // next sheet index - numbered from 0
Console.WriteLine($"sheet name : {sheetInfo.Name} "); // sheet name
Console.WriteLine($"sheet state : {sheetInfo.State} "); // sheet visibility state - visible / hidden
}
#### प्रश्न: क्या Count का उपयोग करने से सारा डेटा मेमोरी में लोड हो जाएगा?नहीं, इमेज टेस्ट में 1 मिलियन पंक्तियाँ * 10 कॉलम का डेटा है, अधिकतम मेमोरी उपयोग <60MB है, और इसमें 13.65 सेकंड लगते हैं

#### प्रश्न: Query में पूर्णांक इंडेक्स का उपयोग कैसे करें?
Query का डिफ़ॉल्ट इंडेक्स स्ट्रिंग Key होता है: A,B,C.... यदि आप इसे संख्यात्मक इंडेक्स में बदलना चाहते हैं, तो कृपया निम्नलिखित विधि बनाएं ताकि इसे कन्वर्ट किया जा सके
void Main()
{
var path = @"D:\git\MiniExcel\samples\xlsx\TestTypeMapping.xlsx";
var rows = MiniExcel.Query(path,true);
foreach (var r in ConvertToIntIndexRows(rows))
{
Console.Write($"column 0 : {r[0]} ,column 1 : {r[1]}");
Console.WriteLine();
}
}private IEnumerable> ConvertToIntIndexRows(IEnumerable
var dic = new Dictionary();
var index = 0;
foreach (var key in keys)
dic[index++] = r[key];
yield return dic;
}
}
#### प्रश्न. जब मान खाली होता है तो एक्सपोर्टिंग एक्सेल के समय बिना शीर्षक का खाली एक्सेल जनरेट होता हैक्योंकि MiniExcel JSON.NET के समान लॉजिक का उपयोग करता है जिससे मान से डायनामिकली टाइप प्राप्त की जाती है ताकि API ऑपरेशनों को सरल बनाया जा सके, डेटा के बिना टाइप पता नहीं चल सकती। बेहतर समझ के लिए issue #133 देख सकते हैं।

Strong type और DataTable हेडर जेनरेट करेंगे, लेकिन Dictionary में एक्सेल फिर भी खाली रहेगा
#### प्रश्न. खाली पंक्ति पर foreach कैसे रोका जाए?
MiniExcel को LINQ TakeWhile के साथ उपयोग किया जा सकता है जिससे foreach इटरेटर को रोका जा सके।

#### प्रश्न. खाली पंक्तियाँ कैसे हटाएं?

IEnumerable :
public static IEnumerable QueryWithoutEmptyRow(Stream stream, bool useHeaderRow, string sheetName, ExcelType excelType, string startCell, IConfiguration configuration)
{
var rows = stream.Query(useHeaderRow,sheetName,excelType,startCell,configuration);
foreach (IDictionary row in rows)
{
if(row.Keys.Any(key=>row[key]!=null))
yield return row;
}
} डेटाटेबल :
public static DataTable QueryAsDataTableWithoutEmptyRow(Stream stream, bool useHeaderRow, string sheetName, ExcelType excelType, string startCell, IConfiguration configuration)
{
if (sheetName == null && excelType != ExcelType.CSV) /Issue #279/
sheetName = stream.GetSheetNames().First(); var dt = new DataTable(sheetName);
var first = true;
var rows = stream.Query(useHeaderRow,sheetName,excelType,startCell,configuration);
foreach (IDictionary row in rows)
{
if (first)
{
foreach (var key in row.Keys)
{
var column = new DataColumn(key, typeof(object)) { Caption = key };
dt.Columns.Add(column);
}
dt.BeginLoadData();
first = false;
}
var newRow = dt.NewRow();
var isNull=true;
foreach (var key in row.Keys)
{
var _v = row[key];
if(_v!=null)
isNull = false;
newRow[key] = _v;
}
if(!isNull)
dt.Rows.Add(newRow);
}
dt.EndLoadData();
return dt;
}
#### प्रश्न: SaveAs(path,value) का उपयोग करके मौजूदा फ़ाइल को कैसे बदलें और "The file ...xlsx already exists" त्रुटि के बिना सहेजें?
कृपया कस्टम फ़ाइल बनाने की लॉजिक के लिए Stream क्लास का उपयोग करें, उदाहरण के लिए:
`C#
using (var stream = File.Create("Demo.xlsx"))
MiniExcel.SaveAs(stream,value);
या, V1.25.0 से, SaveAs में overwriteFile पैरामीटर का समर्थन है ताकि मौजूदा फ़ाइल को ओवरराइट करने को सक्षम/अक्षम किया जा सके
csharp MiniExcel.SaveAs(path, value, overwriteFile: true); ``
सीमाएँ और सावधानियाँ
- अभी xls और एन्क्रिप्टेड फाइल का समर्थन नहीं है
- xlsm केवल Query का समर्थन करता है
संदर्भ
ExcelDataReader / ClosedXML / Dapper / ExcelNumberFormat
धन्यवाद
#### Jetbrains

इस प्रोजेक्ट के लिए मुफ्त All product IDE उपलब्ध कराने के लिए धन्यवाद (लाइसेंस)
योगदान साझा करें और दान करें
लिंक https://github.com/orgs/mini-software/discussions/754योगदानकर्ता
--- Tranlated By Open Ai Tx | Last indexed: 2025-10-09 ---










