excel एपप्लस सेटपॉशन चित्र जारी




c#-4.0 epplus (2)

मैं एपप्लस पुस्तकालय का उपयोग कर रहा हूँ एक्सेल 2010 और Asp.Net सी # में संगत फ़ाइलों को उत्पन्न करने के लिए। मैं संस्करण 3.1.2 का उपयोग कर रहा हूं जो इस समय नवीनतम है।

मैं इस तरह की किसी भी चित्र को जोड़ने से पहले, पहले पंक्ति की ऊंचाई निर्धारित कर रहा हूं:

ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("sheet 1");
while (i < dt.Rows.Count + offset)
{
    ws.Row(i).Height = 84;
    i++;
}

dt मेरे डाटाटेबल के साथ डेटारॉज़ है I ऊँचाई सेट करने के बाद, मैं चित्रों को जोड़ने के लिए पंक्तियों के माध्यम से फिर से पाशन कर रहा हूं

while (i < dt.Rows.Count + offset)
{
    var prodImg = ws.Drawings.AddPicture(dr["code"].ToString(), new FileInfo(path));
    prodImg.SetPosition(i - 1, 0, 14, 0);
    prodImg.SetSize(75);
}

यह काम करता है, लेकिन यह नहीं है:

var prodImg = ws.Drawings.AddPicture(dr["code"].ToString(), new FileInfo(path));
int w = prodImg.Image.Width;
int h = prodImg.Image.Height;

if (h > 140) // because height of 84 is 140 pixels in excel
{
    double scale = h / 140.0;
    w = (int)Math.Floor(w / scale);
    h = 140;
}

int xOff = (150 - w) / 2;
int yOff = (140 - h) / 2;

prodImg.SetPosition(i - 1, xOff, 11, yOff);
prodImg.SetSize(w, h);

यह बंद केंद्र तस्वीरें और अनारक्षित छवियों में परिणाम है और यह कोड जो उसी लूप में है:

var prodImgDm = ws.Drawings.AddPicture("bcdm" + dr["code"].ToString(), new FileInfo(pathDm));
prodImgDm.SetPosition(i - 1, 25, 15, 40);
prodImgDm.SetSize(100);

यह कभी कभी काम करता है चित्रों prodImgDm एक स्थिर चौड़ाई और ऊंचाई के साथ datamatrix छवियों हैं और वे हमेशा छोटे / छोटे हैं क्योंकि आकार बदलना करने की आवश्यकता नहीं है तो भी कुछ पंक्तियों में SetSize बिना, यह काम करता है और कुछ अन्य पंक्तियों में, यह काम नहीं करता है। वास्तव में अजीब है क्योंकि कोड एक ही है यह पुस्तकालय और / या एक्सेल में कुछ हो सकता है शायद मैं इसे गलत इस्तेमाल कर रहा हूं? किसी भी एपप्लस तस्वीर विशेषज्ञ?

अग्रिम में धन्यवाद!!

संपादित करें कभी कभी एक तस्वीर एक हज़ार शब्दों के लायक है, इसलिए यहां स्क्रीनशॉट है जैसा कि आप देख सकते हैं कि उत्पाद छवियाँ कक्ष में क्षैतिज और ऊर्ध्वाधर गठबंधन नहीं हैं। और दूरदराज के डेटामेट्रिक्स कभी-कभी 120% के बारे में स्केल किए जाते हैं, जब भी मैं SetSize(100) सेट करता SetSize(100) तो यह मेरे लिए वास्तव में अजीब है तो अंतिम डेटामैटिक्स का सही आकार है ... मैंने पहले से ही यह इतना धागा पाया है लेकिन वह मेरी मदद नहीं करता, मुझे लगता है।

संपादित करें 2013/04/09 Essenpillai ने मुझे सेट करने के लिए एक संकेत दिया

pck.DoAdjustDrawings = false;

लेकिन उसने मुझे अजनबी की छवि भी दी:

डेटाएमैट्रिक्स अभी भी पंक्ति आधार पर बदल रहा है। पंक्ति पर ठीक है, दूसरा नहीं है। और ean13 कोड बहुत विस्तृत है।


शायद मैं बहुत देर हो चुकी हूं, लेकिन मेरा जवाब है .. आप इसे कोडप्लेक्स मुद्दे पर भी पढ़ सकते हैं ( https://epplus.codeplex.com/workitem/14846 )

मुझे इस समस्या को भी मिला

और कुछ शोध के बाद मुझे पता चला कि बग कहाँ है

यह 14 9 लाइन कोड ( ExcelRow.cs फ़ाइल) पर ExcelRow वर्ग में है

एक गलती होती है, जब पंक्ति की ऊँचाई बदल जाती है, यह सभी चित्रों की ऊंचाइयों को फिर से बन्द करता है, लेकिन ऊंचाइयों के अंदर चित्रों की चौड़ाई का उपयोग करता है, इसलिए इसे ठीक करना आसान है।

बस लाइन को बदलने

var pos = _worksheet.Drawings.GetDrawingWidths();

सेवा मेरे

var pos = _worksheet.Drawings.GetDrawingHeight();

छवि पर कोड परिवर्तन देखें

संस्करण 4.0.4 के लिए पीएस वास्तविक


मेरे पास Epplus पुस्तकालय के साथ एक ही समस्या है
मेरे कोड में इसको हल करने का कोई समाधान नहीं मिलने के बाद, मैंने इस लाइब्रेरी के स्रोत कोड की जांच की। एपिप्लस हमेशा उत्कृष्टता बनाते हैं, जैसे कि दो twoCellAnchor ड्राइंग। drawingXYZ.xml फ़ाइलों में आप इस कोड के साथ drawingXYZ.xml पा सकते हैं:

<xdr:twoCellAnchor editAs="oneCell">
  <xdr:from> ... </xdr:from>
  <xdr:to> ... </xdr:to>
  <xdr:pic>
  ...
</xdr:twoCellAnchor>

इसलिए, चित्र हमेशा दो कोशिकाओं से जुड़ा होता है, और यह एपप्लस पुस्तकालय का चर हिस्सा नहीं है। आप ExcelDrawing.cs फ़ाइल में कोड का यह भाग पा सकते हैं।

  XmlElement drawNode = _drawingsXml.CreateElement(
    "xdr", "twoCellAnchor", ExcelPackage.schemaSheetDrawings);
  colNode.AppendChild(drawNode);

आप इस डीएल की अपनी स्वयं की प्रतिलिपि आसान बना सकते हैं। अच्छी खबर यह है कि आपको इस समस्या को ठीक करने के लिए केवल दो फाइलों को संशोधित करने की आवश्यकता है। इसलिए..

इस साइट से एपप्लस लाइब्रेरी के लिए स्रोत कोड की अपनी प्रति डाउनलोड करें और विजुअल स्टूडियो में खोलें।

हमें एक सीलेनचर के रूप में drawing कोड को बनाने की आवश्यकता है, इसलिए हमें चित्रों के लिए <xdr:to> तत्व <xdr:to> हटाना होगा और मापदंडों के रूप में चित्र आयाम के साथ तत्व <xdr:ext />
नया एक्सएमएल संरचना ऐसा दिखेगा:

<xdr:oneCellAnchor editAs="oneCell">
  <xdr:from> ... </xdr:from>
  <xdr:ext cx="1234567" cy="7654321" />
  <xdr:pic>
  ...
</xdr:oneCellAnchor>

ठीक है, तो, यह कैसे करना है?

Epplus कोड में परिवर्तन

ExcelDrawings.cs ( यहाँ फ़ाइल करने के लिए लिंक )

  1. सबसे पहले हम CreateDrawingXml() विधि को संशोधित करते हैं मूल कार्यप्रणाली को संरक्षित करने का आदेश हम डिफ़ॉल्ट मान के साथ एक वैकल्पिक पैरामीटर (अगर एक oneCellAnchor बनाते हैं) oneCellAnchor । और विधि में, इस पैरामीटर के आधार पर, हम एक या टो सेल एंकर बनाते हैं और <xdr:to> तत्व नहीं बनाते या नहीं।

इस विधि कोड का महत्वपूर्ण हिस्सा:

private XmlElement CreateDrawingXml(bool twoCell = true) { 
  if (DrawingXml.OuterXml == "") 
  { ... } // not changed
  XmlNode colNode= _drawingsXml.SelectSingleNode("//xdr:wsDr", NameSpaceManager);
  //First change in method code
  XmlElement drawNode;
  if (twoCell)
    drawNode = _drawingsXml.CreateElement(
      "xdr", "twoCellAnchor", ExcelPackage.schemaSheetDrawings);
  else
    drawNode = _drawingsXml.CreateElement(
      "xdr", "oneCellAnchor", ExcelPackage.schemaSheetDrawings);
  colNode.AppendChild(drawNode);

  //Add from position Element; // Not changed
  XmlElement fromNode = _drawingsXml.CreateElement(
    "xdr", "from", ExcelPackage.schemaSheetDrawings);
  drawNode.AppendChild(fromNode);
  fromNode.InnerXml = "<xdr:col>0</xdr:col><xdr:colOff>0</xdr:colOff>"
    + "<xdr:row>0</xdr:row><xdr:rowOff>0</xdr:rowOff>";

  //Add to position Element;
  //Second change in method
  if (twoCell)
  {
    XmlElement toNode = _drawingsXml.CreateElement(
      "xdr", "to", ExcelPackage.schemaSheetDrawings);
    drawNode.AppendChild(toNode);
    toNode.InnerXml = "<xdr:col>10</xdr:col><xdr:colOff>0</xdr:colOff>"
      + "<xdr:row>10</xdr:row><xdr:rowOff>0</xdr:rowOff>";
  }
  return drawNode;
}

तब हम एक ही फाइल के अंदर AddPicture लिए दो विधियों को संशोधित करते हैं:

public ExcelPicture AddPicture(string Name, Image image, Uri Hyperlink)
{
  if (image != null) {
    if (_drawingNames.ContainsKey(Name.ToLower())) {
      throw new Exception("Name already exists in the drawings collection");
    }
    XmlElement drawNode = CreateDrawingXml(false);
    // Change: we need create element with dimensions
    // like: <xdr:ext cx="3857625" cy="1047750" />
    XmlElement xdrext = _drawingsXml.CreateElement(
      "xdr", "ext", ExcelPackage.schemaSheetDrawings);
    xdrext.SetAttribute("cx", 
      (image.Width * ExcelDrawing.EMU_PER_PIXEL).ToString());
    xdrext.SetAttribute("cy", 
      (image.Height * ExcelDrawing.EMU_PER_PIXEL).ToString());
    drawNode.AppendChild(xdrext);
    // End of change, next part of method is the same:
    drawNode.SetAttribute("editAs", "oneCell");
    ...
  }
}

और इन पद्धति के साथ FileInfo इनपुट पैरामीटर के रूप में:

public ExcelPicture AddPicture(string Name, FileInfo ImageFile, Uri Hyperlink)
{
  if (ImageFile != null) {
    if (_drawingNames.ContainsKey(Name.ToLower())) {
      throw new Exception("Name already exists in the drawings collection");
    }
    XmlElement drawNode = CreateDrawingXml(false);
    // Change: First create ExcelPicture object and calculate EMU dimensions
    ExcelPicture pic = new ExcelPicture(this, drawNode, ImageFile, Hyperlink);
    XmlElement xdrext = _drawingsXml.CreateElement(
      "xdr", "ext", ExcelPackage.schemaSheetDrawings);
    xdrext.SetAttribute("cx", 
      (pic.Image.Width * ExcelDrawing.EMU_PER_PIXEL).ToString());
    xdrext.SetAttribute("cy", 
      (pic.Image.Height * ExcelDrawing.EMU_PER_PIXEL).ToString());
    drawNode.AppendChild(xdrext);
    // End of change, next part of method is the same (without create pic object)
    drawNode.SetAttribute("editAs", "oneCell");
    ...
  }
}

इसलिए, यह सभी महत्वपूर्ण कोड हैं अब हमें नोड्स खोजना और तत्वों में आदेश को संरक्षित करने के लिए कोड बदलना होगा।

private void AddDrawings() हम से xpath बदलते हैं:

XmlNodeList list = _drawingsXml.SelectNodes(
  "//xdr:twoCellAnchor", NameSpaceManager);

इसे करने के लिए :

XmlNodeList list = _drawingsXml.SelectNodes(
  "//(xdr:twoCellAnchor or xdr:oneCellAnchor)", NameSpaceManager);

यह सब इस फाइल में है, अब हम बदलते हैं
ExcelPicture.cs ( यहाँ फाइल करने के लिए लिंक )

इस तरह कन्स्ट्रक्टर में अगले कोड जोड़ने के लिए मूल कोड नोड को ढूंढें:

node.SelectSingleNode("xdr:to",NameSpaceManager);

क्योंकि हम <xdr:to> तत्व हमेशा नहीं बनाते हैं, हम इस कोड को बदलते हैं:

internal ExcelPicture(ExcelDrawings drawings, XmlNode node
  , Image image, Uri hyperlink) 
  : base(drawings, node, "xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name")
{
  XmlElement picNode = node.OwnerDocument.CreateElement(
    "xdr", "pic", ExcelPackage.schemaSheetDrawings);
  // Edited: find xdr:to, or xdr:ext if xdr:to not exists
  XmlNode befor = node.SelectSingleNode("xdr:to",NameSpaceManager);
  if (befor != null && befor.Name == "xdr:to")
    node.InsertAfter(picNode, befor);
  else {
    befor = node.SelectSingleNode("xdr:ext", NameSpaceManager);
    node.InsertAfter(picNode, befor);
  }
  // End of change, next part of constructor is unchanged
  _hyperlink = hyperlink;
  ...
}

और समान रूप से FileInfo के साथ दूसरे निर्माता के लिए इनपुट पैरामीटर के रूप में:

internal ExcelPicture(ExcelDrawings drawings, XmlNode node
  , FileInfo imageFile, Uri hyperlink) 
  : base(drawings, node, "xdr:pic/xdr:nvPicPr/xdr:cNvPr/@name")
{
  XmlElement picNode = node.OwnerDocument.CreateElement(
    "xdr", "pic", ExcelPackage.schemaSheetDrawings);
  // Edited: find xdr:to, or xdr:ext if xdr:to not exists
  XmlNode befor = node.SelectSingleNode("xdr:to", NameSpaceManager);
  if (befor != null && befor.Name == "xdr:to")
    node.InsertAfter(picNode, befor);
  else {
    befor = node.SelectSingleNode("xdr:ext", NameSpaceManager);
    node.InsertAfter(picNode, befor);
  }
  // End of change, next part of constructor is unchanged
  _hyperlink = hyperlink;
  ...

अब, चित्रों को एक के रूप में बनाया गया है oneCellAnchor । यदि आप चाहें, तो आप बूथ वेरिएंट के लिए एकाधिक AddPicture विधियां बना सकते हैं। अंतिम चरण इस प्रोजेक्ट का निर्माण कर रहा है और अपना स्वयं का कस्टम EPPlus.dll बना सकता है। फिर अपने प्रोजेक्ट को बंद करें जो इस डीएलएल का इस्तेमाल करते हैं और नई परियोजनाओं EPPlus.dll , EPPlus.pdb , EPPlus.XML को अपने प्रोजेक्ट के भीतर EPPlus.XML करें (उसी तरह बैकअप और अपनी मूल डीएलएल फाइलें बदल दें) (ताकि आपको इसमें कोई भी बदलाव करने की आवश्यकता न हो आपके प्रोजेक्ट संदर्भ या सेटिंग)।
फिर अपनी परियोजना को खोलें और पुनर्निर्माण करें और कोशिश करें कि क्या यह आपकी समस्या को हल करता है।