Shannaz Ответов: 2

Последовательность System.invalidoperationexception не содержит элементов openxml


Я получаю некоторые ошибки исключения, используя OpenXML для заполнения данных с сервера MSSQL на элементе управления контентом. Я хочу сделать простую прогулку, чтобы данные были заполнены из таблицы в базе данных и напечатаны в документе MS Word, и я использую OpenXML SDK.

Скомпилировав программу и запустив ее, чтобы посмотреть, что произойдет, я получаю эту ошибку исключения : последовательность system.invalidoperationexception не содержит элементов

Мой код выглядит примерно так

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Drawing;
using System.Data.SqlClient;
using System.IO;

namespace DesktopSignaturetest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string constring = @"Data Source=DESKTOP-9CM4N5S\SQLEXPRESS;Initial Catalog=SignatureBox2;User ID=sa;Password=123456;";
            using (SqlConnection con = new SqlConnection(constring))
            {
                con.Open();
                string q = "select * from SignatureBox_DB where StaffID = @StaffID";
                using (SqlCommand cmd = new SqlCommand(q, con))
                {
                    cmd.Parameters.AddWithValue("@StaffID", textBox1.Text);
                    using (SqlDataReader rd = cmd.ExecuteReader())
                    {
                        try
                        {
                            if (rd.Read())
                            {
                                string fileName = @"C:\Users\emi\Desktop\test.jpg";
                                byte[] imageBytes = Convert.FromBase64String(rd["SignatureBase64"].ToString());
                                string fullname = rd["FullName"].ToString();
                                string designation = rd["Designation"].ToString();
                                MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
                                ms.Write(imageBytes, 0, imageBytes.Length);
                                Image image = Image.FromStream(ms, true, true);
                                image.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);

                                using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\Users\emi\Desktop\MSWordTest.docx", true))
                                {
                                    MainDocumentPart mainPart = doc.MainDocumentPart;
                                    SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where
                                    (r => r.SdtProperties.GetFirstChild<Tag>().Val == "Name").Single();

                                    SdtBlock desg = mainPart.Document.Body.Descendants<SdtBlock>().Where
                                    (r => r.SdtProperties.GetFirstChild<Tag>().Val == "Designation").Single();


                                    SdtBlock cc = doc.MainDocumentPart.Document.Body.Descendants<SdtBlock>()
                                    .FirstOrDefault(c =>
                                    {
                                        SdtProperties p = c.Elements<SdtProperties>().FirstOrDefault();
                                        if (p != null)
                                        {
                                            // Is it a picture content control?
                                            SdtContentPicture pict =
                                                p.Elements<SdtContentPicture>().FirstOrDefault();
                                            // Get the alias.
                                            SdtAlias a = p.Elements<SdtAlias>().FirstOrDefault();
                                            if (pict != null && a.Val == "Signature")
                                                return true;
                                        }
                                        return false;
                                    });

                                    string embed = null;
                                    if (cc != null)
                                    {
                                        Drawing dr = cc.Descendants<Drawing>().FirstOrDefault();
                                        if (dr != null)
                                        {
                                            Blip blip = dr.Descendants<Blip>().FirstOrDefault();
                                            if (blip != null)
                                                embed = blip.Embed;
                                        }
                                    }
                                    if (embed != null)
                                    {
                                        IdPartPair idpp = doc.MainDocumentPart.Parts
                                            .Where(pa => pa.RelationshipId == embed).FirstOrDefault();
                                        if (idpp != null)
                                        {
                                            DocumentFormat.OpenXml.Drawing.Text name = block.Descendants<DocumentFormat.OpenXml.Drawing.Text>().Single();
                                            DocumentFormat.OpenXml.Drawing.Text desgx = desg.Descendants<DocumentFormat.OpenXml.Drawing.Text>().Single();
                                            name.Text = fullname;
                                            desgx.Text = designation;
                                            ImagePart ip = (ImagePart)idpp.OpenXmlPart;
                                            using (FileStream fileStream =
                                                File.Open(fileName, FileMode.Open))
                                                ip.FeedData(fileStream);
                                            MessageBox.Show("Done!");
                                        }
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.ToString());
                        }
                        finally
                        {
                            con.Close();
                        }
                    }
                }
            }
        }
    }
}


Что я уже пробовал:

Здесь код выдает ошибку исключения

SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where
(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Name").Single();


Пожалуйста, что я не так понимаю?

2 Ответов

Рейтинг:
1

F-ES Sitecore

Один из ваших запросов в этой строке не возвращает никаких результатов. Разделите строку на отдельные запросы, чтобы вы могли протестировать их в отладчике. Что-то вроде

var a = mainPart.Document.Body.Descendants<SdtBlock>();
var b = a.Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == "Name");
SdtBlock block = b.Single();


Как только вы выяснили, какой бит возвращает пустой результирующий набор, попробуйте выяснить, почему это так. Либо данные неверны, либо вы неправильно их обрабатываете, либо отсутствие результатов является допустимым результатом, и вам нужно изменить свой код, чтобы приспособиться к нему. Мы не знаем ваших бизнес-правил, поэтому вам придется решить, что именно нужно исправить.


Рейтинг:
0

Devesh S

Single может выдать эту ошибку, если в последовательности нет элемента.

Попробуйте использовать SingleorDefault, который вернет null, если значение не найдено.

Ссылка Msdn: Перечислимый.Единый Метод (System.Linq) | Microsoft Docs[^]

Хорошее объяснение здесь

LINQ, которая сначала против один против последних метода. | Код Мартини[^]