Rawan Mansourr Ответов: 2

Слияние документов из базы данных в один документ


У меня есть веб-приложение ,которое принимает файлы вложений (изображения и документы Word) в форматах, и каждый файл, сохраненный в базе данных, имеет приоритетный номер,
Мне нужен способ, который берет эти файлы из базы данных, упорядоченной по приоритету , а затем объединяет их в один файл ,пожалуйста, любая помощь, чтобы сделать это ?

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

public void load()
   {
       connection.Open();
       string strQuery2 = "select Data,Priority from Attcehments where CourseNum='" + course_number + "' and Semester='" + semester + "' ORDER BY Priority ASC;";

       SqlCommand cmd = new SqlCommand(strQuery2, connection);

       cmd.ExecuteNonQuery();

       DataTable dt = GetData(cmd);

       if (dt != null)
       {

           download(dt);

       }
   }

private DataTable GetData(SqlCommand cmd)
   {

       DataTable dt = new DataTable();

       String strConnString = System.Configuration.ConfigurationManager

       .ConnectionStrings["connect"].ConnectionString;

       SqlConnection con = new SqlConnection(strConnString);

       SqlDataAdapter sda = new SqlDataAdapter();

       cmd.CommandType = CommandType.Text;

       cmd.Connection = con;

       try
       {

           con.Open();

           sda.SelectCommand = cmd;

           sda.Fill(dt);

           return dt;

       }

       catch
       {

           return null;

       }

       finally
       {

           con.Close();

           sda.Dispose();

           con.Dispose();

       }

   }//data table

   private void download(DataTable dt)
   {
      string name = dt.Rows[0]["priority"].ToString();
       Byte[] bytes = (Byte[])dt.Rows[0]["Data"];
       // System.Text.UnicodeEncoding.UTF8.GetBytes(dt.Rows[0]["Data"].ToString());
       using (FileStream fs = new FileStream(@"C:\\Users\\Rawan Mansour\\Desktop\\"+name+".docx", FileMode.Create,FileAccess.ReadWrite))
       {
           fs.Write(bytes, 0, bytes.Length);
           fs.Close();
       }

       MessageBox.Show("File saved successfully ");




   }

CHill60

Ваш код подвержен атаке SQL-инъекций. Никогда не объединяйте строки для формирования вашего SQL. Вместо этого используйте SqlParameters.

Rawan Mansourr

хорошо, спасибо, я так и сделаю

F-ES Sitecore

Как их объединить? Если я объединю три документа Word и 4 изображения, каков будет результат? Каков будет результат, если я объединю всего 5 изображений?

Rawan Mansourr

результатом будут документы word всех из них

Richard Deeming

Вы говорите, что это веб-приложение, но код, который вы разместили, не будет работать в веб-приложении.

Во-первых, вы не можете просто записать файл на диск и ожидать, что он появится в файловой системе клиента. Если бы вы могли, это было бы серьезной уязвимостью системы безопасности. Вместо этого вам нужно записать данные файла в Response, а также соответствующие заголовки для описания типа контента и имени файла. Затем пользователь выбирает, хочет ли он сохранить файл и где его сохранить.

А во-вторых, MessageBox.Show не собирается показывать сообщение пользователю. В лучшем случае он выдаст исключение, сообщающее вам, что процесс не является интерактивным. В худшем случае он будет отображать сообщение на сервере, где его никто никогда не увидит, и ваш код будет висеть, ожидая, когда кто-то войдет на сервер и отклонит сообщение.

Rawan Mansourr

спасибо за эти подсказки

Rawan Mansourr

что я могу использовать вместо messageBox. show, вы можете мне помочь?

Richard Deeming

Обычно вы регистрируете клиентский скрипт для вызова alert("Your message here..."); когда страница загружается.

Но вы не можете совместить это с загрузкой файла.

Rawan Mansourr

хорошо, а как насчет диалогового окна с да или нет?

Richard Deeming

Не совсем выполнимо. Javascript работает после ваш код позади закончил выполнение и вернул ответ клиенту. Код не может задать пользователю вопрос, а затем изменить свое поведение на основе ответа.

Rawan Mansourr

Но я не использую Java script , я использую Asp.net

Richard Deeming

Если вы хотите показать сообщение пользователю, то вы будете использовать Javascript. У тебя нет выбора.

Rawan Mansourr

Пожалуйста, еще один вопрос , Как я буду выполнять эту попытку поймать без окна сообщения, когда я использую скрипт, это просто перенаправление на страницу входа в систему без показа сообщения, что я должен делать?
пробовать
{
cookie = запрос.Cookies["Номер Курса"]. Value;
семестр = запрос.Cookies ["Семестр"]. Value;
Типа int32.Метод tryparse(печенье, из course_number);


}
ловить
{

Ящик для сообщений.Показать ("пожалуйста, сначала выберите курс и семестр с главной страницы!!");
Ответ.Перенаправление ("~/MainPage. aspx");
}

Richard Deeming

Передайте флаг в строке запроса: Скрыть   скопировать код

Response.Redirect("~/MainPage.aspx?err=1");

Затем в MainPage, считайте флаг строки запроса и при необходимости выводите сообщение об ошибке.

Dave Kreskowiak

Вам придется создать новый документ Word с помощью OpenXML SDK. Для каждого элемента, который вы хотите поместить в документ, вам придется написать код, чтобы правильно поместить эти элементы в документ. Размещение в виде изображения будет отличаться от копирования содержимого с листа Excel, чтобы поместить его в него, что будет отличаться от копирования в него документа Word.

По сути, вы пишете код для поддержки всех типов вложений, которые вы хотите поддерживать, чтобы поместить их в этот один документ Word.

2 Ответов

Рейтинг:
2

Stephen Eubanks

Как уже указывалось ранее, OpenXML - это правильный подход. Тем не менее, он довольно сложен в освоении и подвержен ошибкам, особенно для новичка. Поэтому моя рекомендация состояла бы в том, чтобы использовать стороннюю библиотеку. В вашем сценарии окончательный документ будет полностью подготовлен на заднем конце, а затем записан в объект ответа, который загрузит его в браузер на клиенте.

Поскольку вам нужно смешивать документы Word и изображения, я рекомендую вам создать шаблон word с заполнителем для изображения. Затем вы создадите документ Word во время выполнения для каждого изображения, объединив шаблон и изображение. Эти документы Word с изображениями затем будут объединены с другими обычными документами Word в окончательный документ Word.

Здесь это фрагмент кода, который показывает, как объединить несколько документов Word в один.


Рейтинг:
18

ZurdoDev

Как было указано в комментариях, вам придется написать код для поддержки каждого из типов файлов. Для типов файлов Office можно использовать SDK OpenXML, а изображения можно помещать в документы Word с помощью этого SDK.

Или вы можете использовать pdf-инструмент, например iTextSharp, и создать pdf-файл. Это может быть проще, если ваши требования поддерживают pdf.


Rawan Mansourr

нет, я не хочу использовать PDF, только документы word

ZurdoDev

ОК. Тогда идите с OpenXML SDK.

ZurdoDev

ОК. Тогда идите с OpenXML SDK.