2012-02-22 8 views
25

मुझे अपनी OpenXML बनाई गई स्प्रेडशीट खोलते समय एक त्रुटि प्राप्त हो रही है। निम्नानुसार त्रुटि है।मरम्मत किए गए रिकॉर्ड्स: स्क्रैच से बनाए गए वर्कशीट से सेल जानकारी

Repaired Records: Cell information from /xl/worksheets/sheet.xml part 
Repaired Records: Cell information from /xl/worksheets/sheet2.xml part 
Repaired Records: Cell information from /xl/worksheets/sheet3.xml part 

केवल एक चीज मैं ऑनलाइन मिल सकता है कि मददगार था इस मुद्दे के लिए एक एल्गोरिथ्म जो किसी एक सेल को कई बार समस्या पैदा कर बदल की चर्चा थी। ऐसा कहकर, मैं अपने कन्स्ट्रक्टर को स्प्रेडशीट दस्तावेज़ के साथ-साथ एक सेल को अपडेट करने के लिए तीन कार्यों को जोड़ने जा रहा हूं (जो मैं एक बार करता हूं)।

मैं आवश्यकतानुसार कोई अतिरिक्त कार्य प्रदान कर सकता हूं, लेकिन मेरा मानना ​​है कि समस्या नीचे सूचीबद्ध दो में कहीं कहीं है। के रूप में इरादा

वैसे,

GetWorksheetPartByName 
InsertCellInWorksheet 
GetCell 

सभी कार्य करना चाहिए।

वास्तविक कार्यक्रम

static void Main(string[] args) 
    { 
     //Full path for File 
     const string newFile = "@C:\test.xlsx"; 

     //Constructor creates default worksheet called "mySheet" 
     var spreadsheet = new XLSXHelper(newFile); 

     //updating some cells. 
     spreadsheet.UpdateCell("mySheet", "D2", "R", 2); 
    } 

निर्माता

public XLSXHelper(string filepath) 
    { 
     newFile = filepath; 
     spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook); 
     this.workbookPart = spreadsheetDocument.AddWorkbookPart(); 
     workbookPart.Workbook = new Workbook(); 
     this.worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
     worksheetPart.Worksheet = new Worksheet(new SheetData()); 
     Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook. 
     AppendChild<Sheets>(new Sheets()); 
     Sheet sheet = new Sheet() 
     { 
      Id = spreadsheetDocument.WorkbookPart. 
       GetIdOfPart(worksheetPart), 
      SheetId = 1, 
      Name = "mySheet" 
     }; 
     sheets.Append(sheet); 
     workbookPart.Workbook.Save(); 
     spreadsheetDocument.Close(); 
    } 

अद्यतन सेल

public void UpdateCell(string worksheetName, string textToInsert, string columnName, uint rowIndex) 
    { 
     using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(newFile, true)) 
     { 
      WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, worksheetName); 
      if (worksheetPart != null) 
      { 
       InsertCellInWorksheet(columnName, rowIndex, worksheetPart); 
       Cell cell = GetCell(worksheetPart.Worksheet,columnName, rowIndex); 
       cell.CellValue = new CellValue(textToInsert); 
       worksheetPart.Worksheet.Save(); 
      } 
     } 
    } 
+0

[EPPlus] (http://epplus.codeplex.com/) का उपयोग करते हुए, मेरे कोड में त्रुटि आई, जब मैंने वर्कशीट बनाया जिसमें या तो बहुत लंबा नाम और/या निषिद्ध वर्ण हैं। समाधान वर्कशीट के लिए एक संक्षिप्त, वैध नाम का उपयोग करना था। –

उत्तर

47

आप जोड़ रहे हैं एक संख्या के बजाय एक सेल के लिए एक स्ट्रिंग (या एक स्ट्रिंग जिसे किसी संख्या में परिवर्तित किया जा सकता है) तो आपको सेललाइन के बजाय इनलाइन स्ट्रिंग या साझा स्ट्रिंग का उपयोग करना चाहिए। यदि मूल्य संख्यात्मक है तो आप केवल सेलवैल्यू का उपयोग कर सकते हैं।

जब CellValue उपयोग करते हुए उत्पन्न एक्सएमएल लग रहा है कि:

<x:row> 
    <x:c t="inlineStr"> 
    <x:is> 
     <x:t>Foo</x:t> 
    </x:is> 
    </x:c> 
</x:row> 

टिप्पणी इनलाइन स्ट्रिंग के लिए और उस नोड "है":

<x:row> 
    <x:c> 
    <x:v>12345</x:v> 
    </x:c> 
</x:row> 

आप एक इनलाइन स्ट्रिंग यह कैसा दिखता का उपयोग करते हैं सेल प्रकार विशेषता "inlineStr" पर सेट है।

cell.DataType = CellValues.InlineString; 
cell.InlineString = new InlineString() { Text = new Text(textToInsert) }; 

मैं क्या पढ़ा है साझा तार का उपयोग कर बेहतर है लेकिन इनलाइन तार का उपयोग कर त्रुटि से बचा जाता है और बस ठीक लग रहा है जब आप को खोलने से:

यहाँ पाठ वाला कोई कक्ष के लिए सही एक्सएमएल उत्पन्न करने के लिए सी # कोड है एक्सेल में फ़ाइल।

+1

बिल्कुल वही जो मुझे चाहिए, आपको बहुत धन्यवाद! :) – Chiramisu

+0

बहुत धन्यवाद में मदद की! क्या सभी उपलब्ध प्रकारों पर दस्तावेज है? Google की खोज की लेकिन बहुत कुछ नहीं आया है ... –

+0

http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.cellvalues.aspx – Josh

7

मुझे एहसास है कि यह एक पुराना धागा है, लेकिन मेरे पास प्रोग्रामेटिक रूप से जेनरेट की गई एक्सेल शीट के लिए भी एक ही त्रुटि संदेश पॉप अप था। मेरा मुद्दा यह था कि मैं वर्कशीट का नाम उस नाम से स्थापित कर रहा था जिसमें इसमें आगे की कमी थी।

उम्मीद है कि यह किसी अन्य व्यक्ति की मदद करता है जो इस धागे पर ठोकर खाता है क्योंकि यह विषय पर सबसे लोकप्रिय धागा है।

+0

Thnx, SyncFusion lib की सहायता से उत्पन्न फ़ाइल से त्रुटि पर खोज करने से आया था, और इससे इसकी सहायता मिली थी। मेरे लिए समस्या नाम में "[]" थी, वह एक्सेल "()" में बदलना चाहता था। – JOG

+1

मैं सिर्फ यह ध्यान रखना चाहता हूं कि इस मुद्दे को भी ठीक किया गया जब मुझे मूल रूप से प्रश्नों की तुलना में थोड़ा अलग त्रुटि मिली। "मरम्मत रिकॉर्ड्स: /xl/workbook.xml भाग (वर्कबुक) से वर्कशीट गुण" यह एक अवैध चरित्र नहीं था, लेकिन कार्यपुस्तिका का नाम बहुत लंबा था। –

1

एक और देर से - लेकिन जांचें कि आप एक पंक्ति में कोशिकाओं को कैसे जोड़ रहे हैं। क्या आपने सेल कोड को काट और पेस्ट किया है जिसमें पंक्ति में मौजूदा सेल संदर्भ (ए 1 आदि) के साथ 'सरल' तुलना है? इस मामले में यदि आपके पास कॉलम जेड - एए 1 के आगे एक सेल है - तो आप सेल बी 1 से पहले सेल (उदाहरण) एबी 1 डालने की कोशिश कर सकते हैं)।फिर आपको एक्सेल में लिखित शीट खोलने पर यह त्रुटि मिल जाएगी। इसके बजाए, यदि प्रत्येक पंक्ति के साथ सेल के बाद सेल जोड़ना है, तो बस संदर्भ सेल सेट के साथ शून्य से पहले डालने के लिए सीधे जाएं - यानी। अंत में नया सेल जोड़ें।

आशा है कि यह समझ में आता है।

1

इस मुद्दे पर खुद को ठोकर खाई और यह धागा पाया। मेरे मामले में अंतर फ़ाइल की मरम्मत नहीं कर सका। समस्या पंक्ति सूचकांक था जो मैंने InsertCellInWorksheettaken from example on MSDN पर पारित किया।

Cell cell = InsertCellInWorksheet("A", lastRow.RowIndex, worksheetPart); 

जब एक पंक्ति सम्मिलित करने, सुनिश्चित करें कि पंक्ति के सूचकांक 1 है, नहीं 0. हालांकि, 0 SheetData संग्रह हैं।

sheetData.InsertAt(new Row() { RowIndex = 1 }, 0); 
lastRow = sheetData.Elements<Row>().LastOrDefault(); 

किसी भी समय जो किसी भी परेशानी से गुज़रता है उसे बचाने की उम्मीद में।

दिलचस्प बात यह है कि, मेरे एकीकरण परीक्षण को पारित किया गया, हालांकि, एक्सेल के माध्यम से फ़ाइल खोलते समय, यह भ्रष्टाचार के बारे में पॉप-अप दिखा रहा था। ऐसा लगता है कि इंडेक्स 0 के साथ एक पंक्ति है, हालांकि, थोड़ा गुप्त है क्योंकि आप एक्सेल के साथ फाइल खोलने में सक्षम नहीं होंगे।

0

(Year2017 :)) संभावित समाधानों की सूची में जोड़ना:

मैं इस मुद्दे का सामना करना पड़ रहा था क्योंकि मैं सही कार्यपुस्तिका ऑब्जेक्ट का उपयोग नहीं किया गया था FileOutputStream इत्यादि लिखने के लिए।

उम्मीद है कि यह किसी की मदद करेगा।

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने के बाद आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे;] (https://stackoverflow.com/help/privileges/comment) इसके बजाय , [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i क्या क्या-बजाय)। – mrun

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