2015-12-31 4 views
8

में एक तालिका का विस्तार करें क्या कोई तरीका है कि मैं सी # में ईपीप्लस में मौजूदा तालिका का विस्तार कर सकता हूं। जिस तरह से मेरा प्रोग्राम काम करता है, मैं केवल 2 पंक्तियों के साथ तालिका बनाता हूं और अधिक जोड़ता रहता हूं। मुझे ExcelTable में किसी भी प्रकार का आकार बदलने का तरीका प्रतीत नहीं होता है। क्या इसके लिए कोई समर्पित तरीका है, या मुझे किसी प्रकार के विकल्प का उपयोग करने की आवश्यकता है?ईपीप्लस सी #

संपादित करें: ठीक है, मैं इसे स्पष्ट करने जा रहा हूं। मेरे पास पहले से ही ईपीप्लस काम कर रहा है और एक्सेलटेबल बना रहा है। मेरा सवाल है: मैं मौजूदा एक्सेलटेबल को बड़ा कैसे कर सकता हूं (अधिक पंक्तियां जोड़ें)?

+0

ईपीप्लस एक्सेल के निर्यात के लिए है, आप वास्तव में क्या चाहते हैं? –

+0

यदि मैं आपके प्रश्न को सही तरीके से समझ रहा हूं, तो मेरा उत्तर एक एक्सेल फ़ाइल को स्मृति में पढ़ेगा और एक पंक्ति जोड़ देगा, फिर फ़ाइल को ओवरराइट करेगा। –

उत्तर

8

दुर्भाग्य से, वहाँ कोई सीधा तरीका है। बिल्कुल यकीन नहीं है कि क्यों ईपीप्लस के डेवलपर्स ExcelTable.Address संपत्ति केवल तैयार करने का विकल्प चुनते हैं। तो सबसे स्पष्ट चयन एक नई टेबल बनाना होगा, सभी गुणों की प्रतिलिपि बनाना (माना जाता है कि आप उन सभी को जानते हैं जिन्हें आवश्यक हैं) और पुराने को हटा दें। बहुत आदर्श नहीं है क्योंकि आप कुछ याद कर सकते हैं।

लेकिन मैं दो अन्य दूसरों को देखता हूं - अगली सुंदर या तो बेहतर तो कॉपी/हटाएं। इसलिए जैसे एक मेज मान लें:

enter image description here

विकल्प 1 आप EPPlus स्रोत कोड कांटा और संपत्ति को पढ़ने की जरूरत/लिखने बना सकता है। internal कीवर्ड को हटाने के द्वारा

public ExcelAddressBase Address 
    { 
     get 
     { 
      return _address; 
     } 
     internal set //REMOVE internal KEYWORD 
     { 
      _address = value; 
      SetXmlNodeString("@ref",value.Address); 
      WriteAutoFilter(ShowTotal); 
     } 
    } 

: आप बदलकर फ़ाइल ExcelTable.cs में ऐसा होगा। लेकिन निश्चित रूप से आपको सावधान रहना होगा ताकि रास्ते में कुछ और तोड़ न सके।

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx"); 

using (var pck = new ExcelPackage(fileInfo)) 
{ 
    var workbook = pck.Workbook; 
    var worksheet = workbook.Worksheets.First(); 

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows) 
    worksheet.Cells["A12"].Value = 10; 
    worksheet.Cells["B12"].Value = 100; 
    worksheet.Cells["C12"].Value = Path.GetRandomFileName(); 

    var tbl = worksheet.Tables["TestTable1"]; 
    var oldaddy = tbl.Address; 
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column); 

    tbl.Address = newaddy; 

    pck.Save(); 
} 

विकल्प 2 सुरक्षित विकल्प लेकिन सबसे "गंदे" एक स्ट्रिंग XML पर की जगह का उपयोग करके होगा: इस के साथ, आप की तरह कुछ कर सकते हैं। हम मान सकते हैं कि पते का केवल एक संदर्भ है क्योंकि, उदाहरण के लिए, ऑटोफिल्टर चालू किया जा सकता है।

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="3" name="TestTable1" displayName="TestTable1" ref="A1:C11" totalsRowShown="0"> 
    <autoFilter ref="A1:C11" /> 
    <tableColumns count="3"> 
     <tableColumn id="1" name="Col1" /> 
     <tableColumn id="2" name="Col2" /> 
     <tableColumn id="3" name="Col3" /> 
    </tableColumns> 
    <tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0" /> 
</table> 

तो हम एक स्ट्रिंग कर सकते हैं इस तरह की जगह:

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx"); 

using (var pck = new ExcelPackage(fileInfo)) 
{ 
    var workbook = pck.Workbook; 
    var worksheet = workbook.Worksheets.First(); 

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows) 
    worksheet.Cells["A12"].Value = 10; 
    worksheet.Cells["B12"].Value = 100; 
    worksheet.Cells["C12"].Value = Path.GetRandomFileName(); 

    var tbl = worksheet.Tables["TestTable1"]; 
    var oldaddy = tbl.Address; 
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column); 

    //Edit the raw XML by searching for all references to the old address 
    tbl.TableXml.InnerXml = tbl.TableXml.InnerXml.Replace(oldaddy.ToString(), newaddy.ToString()); 

    pck.Save(); 
} 
+0

मुझे नहीं लगता कि यह सब आवश्यक है। 'पता' केवल पढ़ने के लिए है, क्योंकि यह रिपोर्ट में डेटा की मात्रा के आधार पर बदलता है। यदि आप फ़ाइल को 'ExcelPackage' के रूप में स्मृति में पढ़ते हैं और इसमें डेटा जोड़ते हैं, तो' पता' जानकारी तदनुसार बदली जाएगी। –

+0

@dubstylee क्या आप एपप्लस और 'एक्सेलटेबल' ऑब्जेक्ट के साथ ऐसा करने में सक्षम हैं? आपके द्वारा पोस्ट किया गया कोड (और अपडेट) 'वर्कशीट' में अंतिम खाली सेल के नीचे सेल में एक मान जोड़ा जाएगा, लेकिन यह 'एक्सेलटेबल' को अपडेट नहीं करेगा। – Ernie

+0

मैंने नहीं किया है। मुझे यकीन नहीं है कि क्या मैं ओपी प्रश्न सही ढंग से समझता हूं, लेकिन ऐसा लगता है कि 'एक्सेलटेबल' का उपयोग करना आवश्यक नहीं है। मैं सीधे 'वर्कशीट' से डेटा तक पहुंचता हूं, जो मेरे सिर में तर्कसंगत रूप से 'एक्सेलटेबल' के समान होता है ... –

-1

आप परिणामी फ़ाइल बचाने के लिए, स्मृति में मौजूदा एक्सेल स्प्रेडशीट को पढ़ने के लिए की आवश्यकता होगी तो आप इसके हेरफेर करने में सक्षम हो जाएगा, और:

var path = @"C:\file.xlsx"; 
var file = File.ReadAllBytes(path); 
var ms = new MemoryStream(file); 
using (var package = new ExcelPackage(ms)) 
{ 
    var ws = package.Workbook.First(); 

    // get index of last row 
    var lastRow = ws.Dimension.End.Row; 
    // add a new row at the end 
    ws.Cells(lastRow + 1, 1).Value = "new row"; 

    var bytes = package.GetAsByteArray(); 
    File.WriteAllBytes(path, bytes); 
} 
4

यहाँ क्या डिफ़ॉल्ट एक्सएमएल जब आप एक्सेल में एक तालिका (ध्यान दें पता करने के लिए 2 संदर्भ) बनाने की तरह दिखाई देगा है यह प्रश्न लगभग एक वर्ष पुराना है, लेकिन उम्मीद है कि किसी को अभी भी एक जवाब की आवश्यकता है, एक प्रत्यक्ष समाधान है, हालांकि ईईप्लस में एक बग के कारण पूरा नहीं हुआ है (मैं v4.1 के साथ काम कर रहा हूं)।

एक्सेलवर्क्सशीट में InsertRow(Int32, Int32, Int32) विधि है। यदि आप तालिका के हिस्से वाले क्षेत्र में पंक्तियां डालते हैं, तो तालिका भी विस्तारित होती है। सीमाएं प्राप्त करने के लिए बस इसकी पता संपत्ति का उपयोग करें। बस तालिका की पहली और आखिरी पंक्ति के बीच डालने के लिए सुनिश्चित करें।

सेल सत्यापन से संबंधित एक दोष है जो मुझे पता है: भले ही आप ओवरलोड का उपयोग करें जो मौजूदा पंक्ति से शैली की प्रतिलिपि बना सकता है, सत्यापन की प्रतिलिपि नहीं बनाई गई है। इससे भी बदतर, सत्यापन छोड़ दिया गया था जहां यह था और इसे कोशिकाओं के साथ स्थानांतरित नहीं किया गया है। मैंने परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि यदि सत्यापन में एक सीमा है और एक सेल लक्ष्य के रूप में नहीं है, तो यदि आप उस सीमा में पंक्तियां डालते हैं तो भी एक का विस्तार किया जाता है।

यदि आप वर्कशीट में डेटा सारणी पर तालिका का विस्तार करना चाहते हैं तो यह आपकी सहायता नहीं करेगा - लेकिन आप अभी भी पंक्तियों को स्थानांतरित कर सकते हैं। और न तो जब आपके पास कई तालिकाओं के साथ-साथ (जो एक दुःस्वप्न है)।

+0

आपके उत्तर के लिए धन्यवाद। हालांकि, यदि एक चार्ट श्रृंखला पूरे कॉलम से बंधी थी तो यह डाली गई पंक्तियों को अनदेखा कर देगी। मैन्युअल डालने चार्ट के बावजूद अद्यतन किया गया था। शायद आप इस तरह के मामले के लिए कामकाज जानते हैं? – Ghosthack

संबंधित मुद्दे