Web Analytics

MiniExcel

⭐ 3234 stars Hindi by mini-software

NuGet निर्माण स्थिति स्टार GitHub स्टार्स संस्करण DeepWiki पूछें


यह परियोजना .NET फाउंडेशन का हिस्सा है और उनकी आचार संहिता के तहत संचालित होती है।


English | 简体中文 | 繁體中文 | 日本語 | 한국어 | हिन्दी | ไทย | Français | Deutsch | Español | Italiano | Русский | Português | Nederlands | Polski | العربية | فارسی | Türkçe | Tiếng Việt | Bahasa Indonesia


आपके Stars या Donations MiniExcel को और बेहतर बना सकते हैं


परिचय

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;

विशेषताएँ

संस्करण 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();

image

#### 2. एक क्वेरी निष्पादित करें और उसे डायनामिक ऑब्जेक्ट्स की सूची में मैप करें बिना हेड का उपयोग किए [[Try it]](https://dotnetfiddle.net/w5WD1J)

| MiniExcel | 1 | |-----------|---| | Github | 2 |


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 के बीच प्रदर्शन queryfirst

#### 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);

image

#### 10. डेटा पढ़ना शुरू करने के लिए सेल निर्दिष्ट करें

csharp MiniExcel.Query(path,useHeaderRow:true,startCell:"B3")
image

#### 11. मर्ज की गई कोशिकाएँ भरें

नोट: दक्षता मर्ज फिल का उपयोग न करने की तुलना में धीमी है

कारण: OpenXml मानक mergeCells को फाइल के नीचे डालता है, जिससे sheetxml पर दो बार foreach की आवश्यकता होती है

csharp var config = new OpenXmlConfiguration() { FillMergedCells = true }; var rows = MiniExcel.Query(path, configuration: config);
image

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

image

#### 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)
आप SharedStringCacheSize का उपयोग करके डिस्क कैशिंग के लिए निर्दिष्ट आकार से अधिक sharedString फ़ाइल का आकार बदल सकते हैं।
csharp var config = new OpenXmlConfiguration { SharedStringCacheSize=50010241024 }; MiniExcel.Query(path, configuration: config);
image

image

एक्सेल बनाएँ/एक्सपोर्ट करें

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

#### 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} });
#### 2. IEnumerable>

csharp var values = new List>() { new Dictionary{{ "Column1", "MiniExcel" }, { "Column2", 1 } }, new Dictionary{{ "Column1", "Github" }, { "Column2", 2 } } }; MiniExcel.SaveAs(path, values);
फ़ाइल परिणाम बनाएँ :

| कॉलम1 | कॉलम2 | |------------|---------| | MiniExcel | 1 | | Github | 2 |

#### 3. IDataReader

  • अनुशंसित, यह सभी डेटा को मेमोरी में लोड करने से बचा सकता है
csharp MiniExcel.SaveAs(path, reader);
image

DataReader कई शीट्स को निर्यात करता है (Dapper ExecuteReader द्वारा अनुशंसित)

csharp using (var cnn = Connection) { cnn.Open(); var sheets = new Dictionary(); sheets.Add("sheet1", cnn.ExecuteReader("select 1 id")); sheets.Add("sheet2", cnn.ExecuteReader("select 2 id")); MiniExcel.SaveAs("Demo.xlsx", sheets); }
#### 4. डाटाटेबल

  • सिफारिश नहीं की जाती, यह सभी डेटा को मेमोरी में लोड कर देगा
  • डाटाटेबल पहले कॉलम नाम के लिए कैप्शन का उपयोग करता है, फिर कॉलम नाम का उपयोग करता है
csharp 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); }

MiniExcel.SaveAs(path, table);

####  5. Dapper क्वेरी

धन्यवाद @shaofing #552, कृपया CommandDefinition + CommandFlags.NoCache का उपयोग करें

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); }
नीचे दिया गया कोड सभी डेटा को मेमोरी में लोड कर देगा

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 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 { ["users"] = users, ["department"] = department }; MiniExcel.SaveAs(path, sheets);

// 2. DataSet var sheets = new DataSet(); sheets.Add(UsersDataTable); sheets.Add(DepartmentDataTable); //.. MiniExcel.SaveAs(path, sheets);

image

#### 8. टेबलस्टाइल्स विकल्प

डिफ़ॉल्ट स्टाइल

image

स्टाइल कॉन्फ़िगरेशन के बिना

csharp var config = new OpenXmlConfiguration() { TableStyles = TableStyles.None }; MiniExcel.SaveAs(path, value,configuration:config);
image

#### 9. ऑटोफ़िल्टर

v0.19.0 से OpenXmlConfiguration.AutoFilter ऑटोफ़िल्टर को सक्षम/अक्षम कर सकता है, डिफ़ॉल्ट मान true है, और ऑटोफ़िल्टर सेट करने का तरीका:

csharp MiniExcel.SaveAs(path, value, configuration: new OpenXmlConfiguration() { AutoFilter = false });

#### 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);
image

#### 11. बाइट एरे फ़ाइल निर्यात

संस्करण 1.22.0 से, जब मान का प्रकार byte[] होता है, तो सिस्टम डिफ़ॉल्ट रूप से सेल में फ़ाइल पथ को सहेजता है, और आयात करते समय सिस्टम इसे byte[] में परिवर्तित कर सकता है। और यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आप OpenXmlConfiguration.EnableConvertByteArray को false पर सेट कर सकते हैं, इससे सिस्टम की दक्षता में सुधार हो सकता है।

image

संस्करण 1.22.0 से, जब मान का प्रकार byte[] होता है, तो सिस्टम डिफ़ॉल्ट रूप से सेल में फ़ाइल पथ को सहेजता है, और आयात करते समय सिस्टम इसे byte[] में परिवर्तित कर सकता है। और यदि आप इसका उपयोग नहीं करना चाहते हैं, तो आप OpenXmlConfiguration.EnableConvertByteArray को false पर सेट कर सकते हैं, इससे सिस्टम की दक्षता में सुधार हो सकता है।

image

#### 12. एक जैसे सेल को लंबवत मर्ज करें

यह सुविधा केवल xlsx प्रारूप में समर्थित है और @merge तथा @endmerge टैग्स के बीच सेल्स को लंबवत रूप से मर्ज करती है। आप @mergelimit का उपयोग करके सेल्स के लंबवत मर्ज की सीमा निर्धारित कर सकते हैं।

csharp var mergedFilePath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid().ToString()}.xlsx");

var path = @"../../../../../samples/xlsx/TestMergeWithTag.xlsx";

MiniExcel.MergeSameCells(mergedFilePath, path);

csharp var memoryStream = new MemoryStream();

var path = @"../../../../../samples/xlsx/TestMergeWithTag.xlsx";

memoryStream.MergeSameCells(path);

मर्ज से पहले और बाद की फ़ाइल सामग्री:

मर्ज सीमा के बिना:

Screenshot 2023-08-07 at 11 59 24

Screenshot 2023-08-07 at 11 59 57

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

Screenshot 2023-08-08 at 18 21 00

Screenshot 2023-08-08 at 18 21 40

#### 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);

image

xml Somebody once told me.
पिछला व्यवहार:

csharp / ... /

OpenXmlConfiguration configuration = new OpenXmlConfiguration() { EnableWriteNullValueCell = false // Default value is true. };

MiniExcel.SaveAs(@"C:\temp\Book1.xlsx", dt, configuration: configuration);

चित्र

xml Somebody once told me.
शून्य और 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);

image

एक्सेल टेम्पलेट में डेटा भरें

  • डिक्लेरेशन Vue टेम्पलेट {{variable name}} के समान है, या कलेक्शन रेंडरिंग {{collection name.field name}}
  • कलेक्शन रेंडरिंग IEnumerable/DataTable/DapperRow को सपोर्ट करता है
#### 1. बेसिक फिल

टेम्पलेट: image

परिणाम: image

कोड:

csharp // 1. By POCO var value = new { Name = "Jack", CreateDate = new DateTime(2021, 01, 01), VIP = true, Points = 123 }; MiniExcel.SaveAsByTemplate(path, templatePath, value);

// 2. By Dictionary var value = new Dictionary() { ["Name"] = "Jack", ["CreateDate"] = new DateTime(2021, 01, 01), ["VIP"] = true, ["Points"] = 123 }; MiniExcel.SaveAsByTemplate(path, templatePath, value);

#### 2. IEnumerable डेटा भरना

नोट1: सूची भरने के लिए समान कॉलम के पहले IEnumerable का उपयोग आधार के रूप में करें

टेम्पलेट: image

परिणाम: image

कोड:

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() { ["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);

#### 3. जटिल डेटा भरना

नोट: मल्टी-शीट्स का समर्थन करता है और एक ही वेरिएबल का उपयोग करता है

टेम्पलेट:

image

परिणाम:

image

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() { ["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);

#### 4. बिग डेटा प्रदर्शन भरें

नोट: IEnumerable डिफर्ड एक्जीक्यूशन का उपयोग करना, न कि ToList, MiniExcel में अधिकतम मेमोरी उपयोग को बचा सकता है

image

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

टेम्पलेट

image

परिणाम

image

क्लास

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 प्रोजेक्ट्स की सूची बनाना

टेम्पलेट

image

परिणाम

image

कोड

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 Dictionary() { ["employees"] = new[] { new {name="Jack",department="HR"}, new {name="Jack",department="HR"}, new {name="John",department="HR"}, new {name="John",department="IT"}, new {name="Neo",department="IT"}, new {name="Loan",department="IT"} } }; await MiniExcel.SaveAsByTemplateAsync(path, templatePath, value);
##### 1. @group टैग के साथ और @header टैग के साथ

पूर्व

before_with_header

बाद

after_with_header

##### 2. @group टैग के साथ और @header टैग के बिना

पूर्व

before_without_header

बाद

after_without_header

##### 3. @group टैग के बिना

पूर्व

without_group

बाद

without_group_after

#### 8. सेल के अंदर If/ElseIf/Else स्टेटमेंट्स

नियम:

  • DateTime, Double, Int के लिए ==, !=, >, >=, <, <= ऑपरेटर का समर्थन करता है।
  • String के लिए ==, != ऑपरेटर का समर्थन करता है।
  • प्रत्येक स्टेटमेंट नई पंक्ति में होनी चाहिए।
  • ऑपरेटर के पहले और बाद में एक स्पेस होना चाहिए।
  • स्टेटमेंट्स के अंदर कोई नई पंक्ति नहीं होनी चाहिए।
  • सेल ठीक नीचे दिए गए प्रारूप में होनी चाहिए।
csharp @if(name == Jack) {{employees.name}} @elseif(name == Neo) Test {{employees.name}} @else {{employees.department}} @endif
पहले

if_before

बाद में

if_after

#### 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 Dictionary() { ["title"] = "FooCompany", ["managers"] = managers, }; MiniExcel.SaveAsByTemplate(path, templatePath, value);
#### 10. सूत्र

##### 1. उदाहरण अपने सूत्र के आगे $ लगाएँ और संदर्भित श्रेणी की शुरुआत और अंत की पंक्तियों को चिह्नित करने के लिए $enumrowstart और $enumrowend का उपयोग करें:

image

जब टेम्पलेट को रेंडर किया जाता है, तो $ उपसर्ग हटा दिया जाएगा और $enumrowstart तथा $enumrowend को गिनने योग्य श्रेणी की शुरुआत और अंत की पंक्ति संख्याओं से बदल दिया जाएगा:

image

##### 2. अन्य उदाहरण सूत्र:

| | | |--------------|-------------------------------------------------------------------------------------------| | योग | $=SUM(C{{$enumrowstart}}:C{{$enumrowend}}) | | वैकल्पिक औसत | $=SUM(C{{$enumrowstart}}:C{{$enumrowend}}) / COUNT(C{{$enumrowstart}}:C{{$enumrowend}}) | | श्रेणी | $=MAX(C{{$enumrowstart}}:C{{$enumrowend}}) - MIN(C{{$enumrowstart}}:C{{$enumrowend}}) |

#### 11. अन्य

##### 1. टेम्पलेट पैरामीटर कुंजी की जांच

V1.24.0 से, डिफ़ॉल्ट रूप से टेम्पलेट में गायब पैरामीटर कुंजी को अनदेखा कर दिया जाता है और उसे खाली स्ट्रिंग से बदल दिया जाता है, IgnoreTemplateParameterMissing अपवाद फेंकने को नियंत्रित कर सकता है या नहीं।

csharp var config = new OpenXmlConfiguration() { IgnoreTemplateParameterMissing = false, }; MiniExcel.SaveAsByTemplate(path, templatePath, value, config)
image

एक्सेल कॉलम नाम/इंडेक्स/इग्नोर एट्रिब्यूट

#### 1. कॉलम नाम, कॉलम इंडेक्स, कॉलम इग्नोर निर्दिष्ट करें

एक्सेल उदाहरण

image

कोड

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(path).ToList(); Assert.Equal("Column1", rows[0].Test1); Assert.Equal("Column2", rows[0].Test2); Assert.Null(rows[0].Test3); Assert.Equal("Test7", rows[0].Test4); Assert.Null(rows[0].Test5); Assert.Null(rows[0].Test6); Assert.Equal("Test4", rows[0].Test7);

#### 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);
परिणाम

image

क्वेरी कस्टम फ़ॉर्मेट रूपांतरण को सपोर्ट करती है

image

#### 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. ExcelColumnAttribute

V1.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. DynamicColumnAttribute

V1.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);
image

#### 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 { ["usersSheet"] = users, ["departmentSheet"] = department };

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); }
image

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"); }
#### हटाएं(प्रतीक्षा में)

#### अपडेट(प्रतीक्षा में)

एक्सेल प्रकार ऑटो चेक

  • MiniExcel डिफ़ॉल्ट रूप से फाइल एक्सटेंशन के आधार पर जांचेगा कि यह xlsx है या csv, लेकिन इसमें गलतियां हो सकती हैं, कृपया इसे मैन्युअल रूप से निर्दिष्ट करें।
  • स्ट्रीम से यह पता नहीं लगाया जा सकता कि वह किस एक्सेल से है, कृपया इसे मैन्युअल रूप से निर्दिष्ट करें।
csharp stream.SaveAs(excelType:ExcelType.CSV); //or stream.SaveAs(excelType:ExcelType.XLSX); //or stream.Query(excelType:ExcelType.CSV); //or stream.Query(excelType:ExcelType.XLSX);

सीएसवी

#### नोट

  • डिफ़ॉल्ट रूप से रिटर्न किया गया प्रकार string होता है, और मान को नंबर या दिनांक में परिवर्तित नहीं किया जाएगा, जब तक कि प्रकार को स्ट्रॉन्ग टाइपिंग जेनेरिक द्वारा परिभाषित न किया गया हो।
#### कस्टम सेपरेटर

डिफ़ॉल्ट रूप से सेपरेटर , होता है, आप कस्टमाइज़ेशन के लिए Seperator प्रॉपर्टी को संशोधित कर सकते हैं।

csharp var config = new MiniExcelLibs.Csv.CsvConfiguration() { Seperator=';' }; MiniExcel.SaveAs(path, values,configuration: config);
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();
#### कस्टम लाइन ब्रेक

डिफ़ॉल्ट रूप से \r\n न्यूलाइन कैरेक्टर है, आप अनुकूलन के लिए NewLine प्रॉपर्टी को संशोधित कर सकते हैं

csharp var config = new MiniExcelLibs.Csv.CsvConfiguration() { NewLine='\n' }; MiniExcel.SaveAs(path, values,configuration: config);
#### कस्टम कोडिंग

  • डिफ़ॉल्ट एन्कोडिंग "बाइट ऑर्डर मार्क्स से एन्कोडिंग का पता लगाएं" है (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 Task> QueryAsync(string path, bool useHeaderRow = false, string sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration configuration = null) public static Task> QueryAsync(this Stream stream, string sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration configuration = null) where T : class, new() public static Task> QueryAsync(string path, string sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration configuration = null) where T : class, new() public static Task>> QueryAsync(this Stream stream, bool useHeaderRow = false, string sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration configuration = null) public static Task SaveAsByTemplateAsync(this Stream stream, string templatePath, object value) public static Task SaveAsByTemplateAsync(this Stream stream, byte[] templateBytes, object value) public static Task SaveAsByTemplateAsync(string path, string templatePath, object value) public static Task SaveAsByTemplateAsync(string path, byte[] templateBytes, object value) public static Task QueryAsDataTableAsync(string path, bool useHeaderRow = true, string sheetName = null, ExcelType excelType = ExcelType.UNKNOWN, string startCell = "A1", IConfiguration configuration = null)
-  v1.25.0 में cancellationToken का समर्थन है।

अन्य

#### 1. एनम

सुनिश्चित करें कि एक्सेल और प्रॉपर्टी का नाम एक जैसा हो, सिस्टम स्वतः मैपिंग करेगा (केस असंवेदनशील)

image

V0.18.0 से एनम विवरण का समर्थन है

csharp public class Dto { public string Name { get; set; } public I49RYZUserType UserType { get; set; } }

public enum Type { [Description("General User")] V1, [Description("General Administrator")] V2, [Description("Super Administrator")] V3 }

image

चूंकि 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);
`csharp
using (var excelStream = new FileStream(path: filePath, FileMode.Open, FileAccess.Read))
using (var csvStream = new MemoryStream())
{
   MiniExcel.ConvertXlsxToCsv(excelStream, csvStream);
}
#### 3. कस्टम CultureInfo

संस्करण 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);
Image

#### 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();
    }
}
प्रदर्शन: image

#### 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); }

20210419

#### 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; } }

image

अक्सर पूछे जाने वाले प्रश्न (FAQ)

#### प्रश्न: यदि Excel हेडर शीर्षक क्लास प्रॉपर्टी नाम के बराबर नहीं है, तो मैपिंग कैसे करें?

उत्तर: कृपया ExcelColumnName एट्रिब्यूट का उपयोग करें

image

#### प्रश्न: एक साथ कई शीट्स को कैसे क्वेरी या एक्सपोर्ट करें?

उत्तर: 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);
}
image

#### प्रश्न: शीट की दृश्यता के बारे में जानकारी कैसे प्राप्त करें या एक्सपोर्ट करें?

उत्तर: 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 सेकंड लगते हैं

image

#### प्रश्न: 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 rows) { ICollection keys = null; var isFirst = true; foreach (IDictionary r in rows) { if(isFirst) { keys = r.Keys; isFirst = false; }

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 देख सकते हैं।

image

Strong type और DataTable हेडर जेनरेट करेंगे, लेकिन Dictionary में एक्सेल फिर भी खाली रहेगा

#### प्रश्न. खाली पंक्ति पर foreach कैसे रोका जाए?

MiniExcel को LINQ TakeWhile के साथ उपयोग किया जा सकता है जिससे foreach इटरेटर को रोका जा सके।

Image

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

image

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

jetbrains-variant-2

इस प्रोजेक्ट के लिए मुफ्त All product IDE उपलब्ध कराने के लिए धन्यवाद (लाइसेंस)

योगदान साझा करें और दान करें

लिंक https://github.com/orgs/mini-software/discussions/754

योगदानकर्ता

--- Tranlated By Open Ai Tx | Last indexed: 2025-10-09 ---