2013-08-16 7 views
10

मैंने ओपनएक्सएमएल का उपयोग कर एक्सेल फ़ाइल जेनरेट करने के लिए एक कोड लिखा है। नीचे कोड है जो Excel में कॉलम उत्पन्न करता है।ओपनएक्सएमएल: एक्सेल में ऑटो साइज कॉलम चौड़ाई

Worksheet worksheet = new Worksheet(); 
      Columns columns = new Columns(); 
      int numCols = dt1.Columns.Count; 
      for (int col = 0; col < numCols; col++) 
      { 
        Column c = CreateColumnData((UInt32)col + 1, (UInt32)numCols + 1, 20.42578125D); 

       columns.Append(c); 
      } 
      worksheet.Append(columns); 

इसके अलावा, मैंने स्तंभ बनाने के लिए नीचे की कोशिश की।

Column c = new Column() { Min = (UInt32Value)1U, Max = (UInt32Value)1U, Width = 25.42578125D, BestFit = true, CustomWidth = true}; 

मैंने सोचा कि बेस्टफिट का उपयोग करना चाहिए, इसे काम करना चाहिए। लेकिन यह ऑटो आकार सेट नहीं करता है।

कृपया इस पर मेरी सहायता करें।

धन्यवाद,

उत्तर

7

BestFit संपत्ति एक जानकारी संपत्ति (संभवतः एक्सेल से अनुकूलन के लिए) है। आपको अभी भी कॉलम के लिए चौड़ाई प्रदान करने की आवश्यकता है। इसका मतलब है कि आपको वास्तव में सेल सामग्री के आधार पर कॉलम चौड़ाई की गणना करना है। ओपन एक्सएमएल एसडीके स्वचालित रूप से आपके लिए ऐसा नहीं करता है, इसलिए यह बेहतर है कि आप इसके लिए किसी तृतीय-पक्ष लाइब्रेरी का उपयोग करें।

+1

इस बेस्टफिट संपत्ति के लिए बेहतर समाधान होना चाहिए !!! अब अगस्त 2014 –

0

यहाँ संभव सूत्र चौड़ाई = काटना ([{वर्णों की संख्या} * {अधिकतम अंक चौड़ाई} + {5 पिक्सेल की पैडिंग}]/{अधिकतम अंक चौड़ाई} * 256)/256

10

आप करने के लिए है दुर्भाग्य से

यह मुझे मिला है जो मुझे मिला है। यह मेरे डेटा के लिए काम करता है जो मैंने सेट की गई कुछ शैलियों का ख्याल रखने के लिए कुछ अतिरिक्त कोड के साथ सारणीबद्ध है। यह किसी भी माध्यम से सही नहीं है लेकिन इसके लिए मुझे क्या चाहिए इसके लिए काम करता है।

private WorksheetPart mySheetPart; 
private void WriteToTable() 
{ 
     //Get your sheet data - write Rows and Cells 
     SheetData sheetData = GetSheetData(); 

     //get your columns (where your width is set) 
     Columns columns = AutoSize(sheetData); 

     //add to a WorksheetPart.WorkSheet 
     mySheetPart.Worksheet = new Worksheet(); 
     mySheetPart.Worksheet.Append(columns); 
     mySheetPart.Worksheet.Append(sheetData); 
} 

private Columns AutoSize(SheetData sheetData) 
{ 
     var maxColWidth = GetMaxCharacterWidth(sheetData); 

     Columns columns = new Columns(); 
     //this is the width of my font - yours may be different 
     double maxWidth = 7; 
     foreach (var item in maxColWidth) 
     { 
      //width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256 
      double width = Math.Truncate((item.Value * maxWidth + 5)/maxWidth * 256)/256; 

      //pixels=Truncate(((256 * {width} + Truncate(128/{Maximum Digit Width}))/256)*{Maximum Digit Width}) 
      double pixels = Math.Truncate(((256 * width + Math.Truncate(128/maxWidth))/256) * maxWidth); 

      //character width=Truncate(({pixels}-5)/{Maximum Digit Width} * 100+0.5)/100 
      double charWidth = Math.Truncate((pixels - 5)/maxWidth * 100 + 0.5)/100; 

      Column col = new Column() { BestFit = true, Min = (UInt32)(item.Key + 1), Max = (UInt32)(item.Key + 1), CustomWidth = true, Width = (DoubleValue)width }; 
      columns.Append(col); 
     } 

     return columns; 
    } 


    private Dictionary<int, int> GetMaxCharacterWidth(SheetData sheetData) 
    { 
     //iterate over all cells getting a max char value for each column 
     Dictionary<int, int> maxColWidth = new Dictionary<int, int>(); 
     var rows = sheetData.Elements<Row>(); 
     UInt32[] numberStyles = new UInt32[] { 5, 6, 7, 8 }; //styles that will add extra chars 
     UInt32[] boldStyles = new UInt32[] { 1, 2, 3, 4, 6, 7, 8 }; //styles that will bold 
     foreach (var r in rows) 
     { 
      var cells = r.Elements<Cell>().ToArray(); 

      //using cell index as my column 
      for (int i = 0; i < cells.Length; i++) 
      { 
       var cell = cells[i]; 
       var cellValue = cell.CellValue == null ? string.Empty : cell.CellValue.InnerText; 
       var cellTextLength = cellValue.Length; 

       if (cell.StyleIndex != null && numberStyles.Contains(cell.StyleIndex)) 
       { 
        int thousandCount = (int)Math.Truncate((double)cellTextLength/4); 

        //add 3 for '.00' 
        cellTextLength += (3 + thousandCount); 
       } 

       if (cell.StyleIndex != null && boldStyles.Contains(cell.StyleIndex)) 
       { 
        //add an extra char for bold - not 100% acurate but good enough for what i need. 
        cellTextLength += 1; 
       } 

       if (maxColWidth.ContainsKey(i)) 
       { 
        var current = maxColWidth[i]; 
        if (cellTextLength > current) 
        { 
         maxColWidth[i] = cellTextLength; 
        } 
       } 
       else 
       { 
        maxColWidth.Add(i, cellTextLength); 
       } 
      } 
     } 

     return maxColWidth; 
    } 
+0

है आपने अपनी "GetSheetData()" विधि को परिभाषित नहीं किया है। –

+0

एक मिनट प्रतीक्षा करें, मैं देखता हूं कि आपका क्या मतलब है, आप बस सभी सेल मानों को सेट करने के अपने कार्यान्वयन को लिखना चाहते हैं और फिर कॉलम चौड़ाई सेटिंग के साथ जारी रखें, मेरा बुरा। –

+2

AutoSize() में charWidth चर का उपयोग नहीं किया जाता है? – Macke

1

मैं समय इस पर गौर करने के लिए नहीं था, लेकिन इसके बजाय सिर्फ एक टिप्पणी और a link छोड़ने की, मुझे लगा कि मैं किसी को जो उचित रूप में इस पर कुछ शोध किया है की किसी टिप्पणी का हिस्सा चाहते हैं।

मुझे व्यक्तिगत रूप से वास्तविकता के साथ फिट करने के लिए the official formulas प्राप्त करने में समस्याएं थीं। अर्थात। लघु तारों को बहुत छोटी कोशिकाएं मिलती हैं, लंबे तारों को बहुत बड़ी कोशिकाएं मिलती हैं और सबसे अधिक, एक्सेल में प्रस्तुत मूल्य DocumentFormat.OpenXml.Spreadsheet.Column के Width -property में डाले गए मान से आनुपातिक रूप से छोटा था। मेरा त्वरित समाधान केवल न्यूनतम चौड़ाई था।

मैं अंत में यह करने के लिए क्योंकि xlsx फ़ाइलों को मैं में दिलचस्पी है स्वचालित रूप से जेनरेट कर रहे हैं और जैसे ही अच्छा दिखना चाहिए के रूप में वे खोल रहे हैं पड़ा तो मैं इस में देखा:

वैसे भी, यहाँ टिप्पणी है थोड़ा आगे और पाया कि एक्सेल में स्तंभों को सटीक रूप से आकार देने के लिए कुछ समस्याएं हैं।

  1. आवश्यकता सही चरित्र आकार, जिसका अर्थ है कि MeasureString आप MeasureCharacterRanges उपयोग करने की आवश्यकता उपयोग करने के बजाय, http://groups.google.com/group/microsoft.public.office.developer.com.add_ins/browse_thread/thread/2fc33557feb72ab4/adaddc50480b8cff?lnk=raot

  2. कल्पना के बावजूद 5 पिक्सल (सीमा के लिए 1 और 2 प्रत्येक के लिए जोड़ने के लिए कह रही है देखने के उपयोग करने के लिए साइड मार्जिन) एक्सेल सीमा के लिए 9 -1 का उपयोग करता है, 5 अग्रणी स्थान के लिए और पीछे की जगह के लिए 3 - मुझे केवल एक्सेसिबिलिटी ऐप का उपयोग करके यह मिला। आवर्धक और एक्सेल का उपयोग कर स्वत: असल में मैं अंतर्निहित फ़ॉन्ट मीट्रिक पर मेरी गणना आधारित था, इसलिए मैं वास्तव में या तो MeasureCharacterRanges या MeasureString का उपयोग नहीं करते कॉलम

फिट करने के लिए के बाद पिक्सल गिनती।अगर कोई तो फॉन्ट मीट्रिक से ऐसा करने में रुचि रखता है:

Width = Truncate({DesiredWidth} + 9/{MaxDigitWidth})/256

{MaxDigitWidth} एक पूर्णांक 96 डीपीआई में 0..9 अंक में से किसी का निकटतम पिक्सेल तक पूर्ण है {} DesiredWidth है सभी वर्ण चौड़ाई को एक साथ जोड़ने का योग जहां प्रत्येक वर्ण चौड़ाई चरित्र की चौड़ाई 96 डीपीआई पर निकटतम पूर्णांक तक गोल होती है। ध्यान दें कि प्रत्येक चरित्र को कुल योग

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