से तालिका निकालें मुझे ओपनएक्सएमएल (सी #) के साथ * .docx दस्तावेज़ को पार्स करने में एक समस्या है।DOCX
तो, यहाँ मेरे कदमों है:
1. लोड * .docx दस्तावेज़
2. प्राप्त पैराग्राफ की सूची
3. टेक्स्ट, छवि और तालिका तत्वों के लिए प्रत्येक अनुच्छेद नज़र
4. प्रत्येक पाठ के लिए और छवि तत्व के रूप में * .html फ़ाइल
मुझे पता चला गया है दस्तावेज़ में छवि फ़ाइल का पता लगाने और उसे निकालने के लिए कैसे एचटीएमएल टैग बनाने
5. सहेजें उत्पादन। अब जाने के लिए एक कदम है - टेक्स्ट (पैराग्राफ) में टेबल स्थिति कहां है।
यदि कोई भी ओपनएक्सएमएल का उपयोग कर * .docx दस्तावेज़ में तालिका का पता लगाने के बारे में जानता है तो कृपया मदद करें। धन्यवाद।
अतिरिक्त: ठीक है, क्या मैं स्पष्ट नहीं कर सकता कि मेरा क्या मतलब है। अगर हमें अनुच्छेद की सामग्री मिलती है, तो आप चीज ऑब्जेक्ट्स को टेक्स्टब्लॉक, चित्र आदि के रूप में पा सकते हैं। तो, अगर अनुच्छेद में भाग शामिल है जिसमें चित्र शामिल है तो इसका अर्थ यह है कि Word दस्तावेज़ में इस स्थान पर छवि रखी गई है। मेरी समारोह के
नमूना:
public static string ParseDocxDocument(string pathToFile)
{
StringBuilder result = new StringBuilder();
WordprocessingDocument wordProcessingDoc = WordprocessingDocument.Open(pathToFile, true);
List<ImagePart> imgPart = wordProcessingDoc.MainDocumentPart.ImageParts.ToList();
IEnumerable<Paragraph> paragraphElement = wordProcessingDoc.MainDocumentPart.Document.Descendants<Paragraph>();
int imgCounter = 0;
foreach (Paragraph par in paragraphElement)
{
//Add new paragraph tag
result.Append("<div style=\"width:100%; text-align:");
//Append anchor style
if (par.ParagraphProperties != null && par.ParagraphProperties.Justification != null)
switch (par.ParagraphProperties.Justification.Val.Value)
{
case JustificationValues.Left:
result.Append("left;");
break;
case JustificationValues.Center:
result.Append("center;");
break;
case JustificationValues.Both:
result.Append("justify;");
break;
case JustificationValues.Right:
default:
result.Append("right;");
break;
}
else
result.Append("left;");
//Append text decoration style
if (par.ParagraphProperties != null && par.ParagraphProperties.ParagraphMarkRunProperties != null && par.ParagraphProperties.ParagraphMarkRunProperties.HasChildren)
foreach (OpenXmlElement chield in par.ParagraphProperties.ParagraphMarkRunProperties.ChildElements)
{
switch (chield.GetType().Name)
{
case "Bold":
result.Append("font-weight:bold;");
break;
case "Underline":
result.Append("text-decoration:underline;");
break;
case "Italic":
result.Append("font-style:italic;");
break;
case "FontSize":
result.Append("font-size:" + ((FontSize)chield).Val.Value + "px;");
break;
default: break;
}
}
result.Append("\">");
//Add image tag
IEnumerable<Run> runs = par.Descendants<Run>();
foreach (Run run in runs)
{
if (run.HasChildren)
{
foreach (OpenXmlElement chield in run.ChildElements.Where(o => o.GetType().Name == "Picture"))
{
result.Append(string.Format("<img style=\"{1}\" src=\"data:image/jpeg;base64,{0}\" />", GetBase64Image(imgPart[imgCounter].GetStream()),
((DocumentFormat.OpenXml.Vml.Shape)chield.ChildElements.Where(o => o.GetType().Name == "Shape").FirstOrDefault()).Style
));
imgCounter++;
}
}
}
//Append inner text
IEnumerable<Text> textElement = par.Descendants<Text>();
if (par.Descendants<Text>().Count() == 0)
result.Append("<br />");
foreach (Text t in textElement)
{
result.Append(t.Text);
}
result.Append("</div>");
result.Append(Environment.NewLine);
}
wordProcessingDoc.Close();
return result.ToString();
}
अब मैं पाठ में तालिका जगह निर्दिष्ट करने के लिए (के रूप में यह पद में दिखाई देते हैं) whant।
अंतिम:
ठीक है, हर कोई, मुझे पता चला है। मेरे नमूना समारोह में एक बड़ी गलती। मैं दस्तावेज बॉडी के पैराग्राफ तत्वों का आकलन करता हूं। सारणी पैराग्राफ के समान स्तर पर हैं, इसलिए फ़ंक्शन को अनदेखा करें। इसलिए हमें दस्तावेज़ बॉडी के तत्वों की गणना करने की आवश्यकता है।
यहाँ (यह सिर्फ परीक्षण कोड है, तो यह साफ नहीं है) docx से सही HTML उत्पन्न करने के लिए
public static string ParseDocxDocument(string pathToFile)
{
StringBuilder result = new StringBuilder();
WordprocessingDocument wordProcessingDoc = WordprocessingDocument.Open(pathToFile, true);
List<ImagePart> imgPart = wordProcessingDoc.MainDocumentPart.ImageParts.ToList();
List<string> tableCellContent = new List<string>();
IEnumerable<Paragraph> paragraphElement = wordProcessingDoc.MainDocumentPart.Document.Descendants<Paragraph>();
int imgCounter = 0;
foreach (OpenXmlElement section in wordProcessingDoc.MainDocumentPart.Document.Body.Elements<OpenXmlElement>())
{
if(section.GetType().Name == "Paragraph")
{
Paragraph par = (Paragraph)section;
//Add new paragraph tag
result.Append("<div style=\"width:100%; text-align:");
//Append anchor style
if (par.ParagraphProperties != null && par.ParagraphProperties.Justification != null)
switch (par.ParagraphProperties.Justification.Val.Value)
{
case JustificationValues.Left:
result.Append("left;");
break;
case JustificationValues.Center:
result.Append("center;");
break;
case JustificationValues.Both:
result.Append("justify;");
break;
case JustificationValues.Right:
default:
result.Append("right;");
break;
}
else
result.Append("left;");
//Append text decoration style
if (par.ParagraphProperties != null && par.ParagraphProperties.ParagraphMarkRunProperties != null && par.ParagraphProperties.ParagraphMarkRunProperties.HasChildren)
foreach (OpenXmlElement chield in par.ParagraphProperties.ParagraphMarkRunProperties.ChildElements)
{
switch (chield.GetType().Name)
{
case "Bold":
result.Append("font-weight:bold;");
break;
case "Underline":
result.Append("text-decoration:underline;");
break;
case "Italic":
result.Append("font-style:italic;");
break;
case "FontSize":
result.Append("font-size:" + ((FontSize)chield).Val.Value + "px;");
break;
default: break;
}
}
result.Append("\">");
//Add image tag
IEnumerable<Run> runs = par.Descendants<Run>();
foreach (Run run in runs)
{
if (run.HasChildren)
{
foreach (OpenXmlElement chield in run.ChildElements.Where(o => o.GetType().Name == "Picture"))
{
result.Append(string.Format("<img style=\"{1}\" src=\"data:image/jpeg;base64,{0}\" />", GetBase64Image(imgPart[imgCounter].GetStream()),
((DocumentFormat.OpenXml.Vml.Shape)chield.ChildElements.Where(o => o.GetType().Name == "Shape").FirstOrDefault()).Style
));
imgCounter++;
}
foreach (OpenXmlElement table in run.ChildElements.Where(o => o.GetType().Name == "Table"))
{
result.Append("<strong>HERE'S TABLE</strong>");
}
}
}
//Append inner text
IEnumerable<Text> textElement = par.Descendants<Text>();
if (par.Descendants<Text>().Count() == 0)
result.Append("<br />");
foreach (Text t in textElement.Where(o=>!tableCellContent.Contains(o.Text.Trim())))
{
result.Append(t.Text);
}
result.Append("</div>");
result.Append(Environment.NewLine);
}
else if (section.GetType().Name=="Table")
{
result.Append("<table>");
Table tab = (Table)section;
foreach (TableRow row in tab.Descendants<TableRow>())
{
result.Append("<tr>");
foreach (TableCell cell in row.Descendants<TableCell>())
{
result.Append("<td>");
result.Append(cell.InnerText);
tableCellContent.Add(cell.InnerText.Trim());
result.Append("</td>");
}
result.Append("</tr>");
}
result.Append("</table>");
}
}
wordProcessingDoc.Close();
return result.ToString();
}
private static string GetBase64Image(Stream inputData)
{
byte[] data = new byte[inputData.Length];
inputData.Read(data, 0, data.Length);
return Convert.ToBase64String(data);
}
मुझे पता है कि टेबल को कैसे पढ़ा और पार्स करना है। मेरा सवाल यह है कि ट्रेसिशन टेक्स्ट को कैसे लिखें – EkzoMan
मैंने अपना वर्किंग कोड जोड़ दिया है। आपकी पोस्ट मुझे काम करने के लिए सही दिशा दे रही है, इसलिए मैं आपके उत्तर को सही के रूप में चिह्नित करता हूं – EkzoMan