2010-04-19 15 views
10

पुन: गणना करें, मैं माइक्रोसॉफ्ट ऑफिस ओपनएक्सएमएल एसडीके 2.0 के माध्यम से एक्सेल स्प्रेडशीट की कुछ कोशिकाओं को अपडेट करता हूं। मानों को बदलने से फॉर्मूला युक्त सभी कक्ष बन जाते हैं जो बदली गई कोशिकाओं पर अमान्य पर निर्भर करते हैं। हालांकि, कैश किए गए मानों के कारण एक्सेल फॉर्मुलर का पुनर्मूल्यांकन नहीं करता है, भले ही उपयोगकर्ता "अभी गणना करें" पर क्लिक करता है।ओपनएक्सएमएल एसडीके: एक्सेल को फॉर्मूला

एसडीके के माध्यम से पूरे कार्यपुस्तिका की सभी निर्भर कोशिकाओं को अमान्य करने का सबसे अच्छा तरीका क्या है? अब तक, मैं http://cdonner.com/introduction-to-microsofts-open-xml-format-sdk-20-with-a-focus-on-excel-documents.htm पर निम्नलिखित कोड का टुकड़ा मिल गया है:

  • यह केवल एक शीट को अमान्य कर:

    public static void ClearAllValuesInSheet 
         (SpreadsheetDocument spreadSheet, string sheetName) 
    { 
        WorksheetPart worksheetPart = 
         GetWorksheetPartByName(spreadSheet, sheetName); 
    
        foreach (Row row in 
         worksheetPart.Worksheet. 
          GetFirstChild().Elements()) 
        { 
         foreach (Cell cell in row.Elements()) 
         { 
          if (cell.CellFormula != null && 
            cell.CellValue != null) 
          { 
           cell.CellValue.Remove(); 
          } 
         } 
    
        } 
    
        worksheetPart.Worksheet.Save(); 
    } 
    

    तथ्य के अलावा कि यह टुकड़ा मेरे लिए संकलन नहीं है, यह दो सीमाएँ हैं , हालांकि अन्य चादरों में निर्भर फॉर्मूला

  • हो सकता है, यह किसी भी निर्भरता को ध्यान में रखता नहीं है।

मैं एक ऐसे तरीके की तलाश में हूं जो कुशल है (विशेष रूप से, केवल कोशिकाओं को अमान्य करता है जो किसी निश्चित सेल के मूल्य पर निर्भर करता है), और सभी शीट्स को ध्यान में रखता है।

अद्यतन:

इस बीच मैं कोड & रन संकलन, और कार्यपुस्तिका के सभी पत्रक पर कैश मूल्यों को दूर करने के बनाने में कामयाब रहे हैं। (उत्तर देखें।) फिर भी मुझे बेहतर/वैकल्पिक समाधानों में दिलचस्पी है, विशेष रूप से उन कोशिकाओं के कैश किए गए मानों को कैसे हटाएं जो वास्तव में अद्यतन सेल पर निर्भर करते हैं।

foreach (WorksheetPart worksheetPart in spreadSheet.WorkbookPart.WorksheetParts) 
{ 
    foreach (Row row in 
      worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements()) 
    { 
     foreach (Cell cell in row.Elements()) 
     { 
      if (cell.CellFormula != null && cell.CellValue != null) 
       cell.CellValue.Remove(); 
     } 
    } 
} 
+0

कैश किए गए मानों को हटाने के बाद, आप सेल के मूल्य को कैसे पढ़ते हैं? क्या ऑब्जेक्ट को बंद करना जरूरी है? मेरे मामले में, मुझे मूल्य मिलता है और – mggSoft

उत्तर

39
flushes का उपयोग

मेरे लिए काम करता है!

+0

कूल, बहुत आसान लग रहा है! इसे और अधिक पठनीय बनाने के लिए, क्या आप अपना उत्तर संपादित कर सकते हैं और रिक्त स्थान को अपने स्रोत कोड के सामने हटा सकते हैं? (स्रोत कोड के रूप में पाठ को प्रारूपित करने के लिए आवश्यक 4 रिक्त स्थान) – chiccodoro

+0

बैंग! मेरे लिए भी काम किया, धन्यवाद! – Brian

+0

यह मेरे लिए इस फ़ॉर्म और पिछले संदेश में काम नहीं करता है। मैं क्या कोशिश कर सकता हूँ? – mggSoft

1

यह आंशिक रूप से मेरी समस्या का हल और वहाँ अब तक कोई बेहतर समाधान लगता है के बाद से, एक जवाब के लिए सवाल से बाहर है कि codeblock ले जाया गया ... यह कैसे नए कोड की तरह लग रहा है मैं इस

static void FlushCachedValues(SpreadsheetDocument doc) 
    { 
     doc.WorkbookPart.WorksheetParts 
      .SelectMany(part => part.Worksheet.Elements<SheetData>()) 
      .SelectMany(data => data.Elements<Row>()) 
      .SelectMany(row => row.Elements<Cell>()) 
      .Where(cell => cell.CellFormula != null) 
      .Where(cell => cell.CellValue != null) 
      .ToList() 
      .ForEach(cell => cell.CellValue.Remove()) 
      ; 
    } 

यह कैश की गई मूल्यों

स्वागत करती

2

:

+0

कुछ भी नहीं देता है मैंने कोशिश की है, और कैश किए गए मानों को हटाने के बाद, मुझे मूल्य मिलता है और – mggSoft

+0

कुछ भी नहीं देता है, यह दृष्टिकोण मेरे लिए काम नहीं करता है। मैंने एसओ पर इसी तरह का सवाल पोस्ट किया। –

1

आपको वर्कशीट को अंत में सहेजने की ज़रूरत है, यह मेरे लिए काम करता है।

foreach (WorksheetPart worksheetPart in spreadSheet.WorkbookPart.WorksheetParts) { 
    foreach (Row row in 
      worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements()) { 
     foreach (Cell cell in row.Elements()) { 
      if (cell.CellFormula != null && cell.CellValue != null) 
       cell.CellValue.Remove(); 
     } 
    } 
    worksheetPart.Worksheet.Save(); 
} 
संबंधित मुद्दे