Экспорт из Excel и импорт в Word построчно asp.net mvc - PullRequest
0 голосов
/ 15 октября 2018

Я создал проект, который экспортирует файл Excel в gridView и импортирует его в word.Прямо сейчас я добился этого, щелкнув по идентификатору каждой строки, который отправляется в метод ExportData ().

Теперь я хочу достичь, нажав кнопку ImportALL, создавая отдельные текстовые документы для каждой строки в gridView..

Например, для каждой строки в gridview я хочу иметь что-то вроде

doc1.docx (включая данные первой строки gridview)

doc2.docx (включая вторую gridviewданные строки)

doc3.docx (включая данные третьей строки gridview)

Например:

Вот моя модель .cs

 public class Doc
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Quantity { get; set; }
    public string PriceWord { get; set; }

}

Здесьмое чтение экспортирует данные Excel в контроллере

if (excelFile.FileName.EndsWith("xls") || excelFile.FileName.EndsWith("xlsx"))
            {
                string path = Server.MapPath("~/Content/" + excelFile.FileName);
                if (System.IO.File.Exists(path))
                {
                    System.IO.File.Delete(path);
                }
                excelFile.SaveAs(path);
                ExcelDoc.Application application = new ExcelDoc.Application();
                ExcelDoc.Workbook workbook = application.Workbooks.Open(path);
                ExcelDoc.Worksheet worksheet = workbook.ActiveSheet;
                ExcelDoc.Range range = worksheet.UsedRange;
                List<Doc> docs = new List<Doc>();
                for (int row = 2; row < range.Rows.Count; row++)
                {
                    Doc d = new Doc();
                    d.Id = Int32.Parse(((ExcelDoc.Range)range.Cells[row, 1]).Text);
                    d.Name = ((ExcelDoc.Range)range.Cells[row, 2]).Text;
                    d.Price = Decimal.Parse((((ExcelDoc.Range)range.Cells[row, 3]).Text));
                    d.PriceWord = numberToWordConverter(s.Price.ToString());
                    d.Quantity = ((ExcelDoc.Range)range.Cells[row, 4]).Text;
                    docs.Add(d);
                }

                ViewBag.Docs = docs;
                TempData["docs"] = docs;
                return View("Success");

            }

            else
            {

                ViewBag.Error = "File type is incorrect";
                return View("Index");
            }

И вот метод экспорта слова.

      public ActionResult ExportData(int? id)
    {
        var docs = TempData["Docs"] as List<Doc>;
        GridView gv = new GridView();
        gv.DataSource = docs.Where(x=> x.Id == id);
        gv.DataBind();

            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment; filename=dosya.doc");
            Response.ContentType = "application/vnd.ms-word ";
            Response.Charset = string.Empty;

            StringWriter sw = new StringWriter();
            HtmlTextWriter htw = new HtmlTextWriter(sw);
            gv.RenderControl(htw);
            Response.Output.Write(sw.ToString());
            Response.Flush();
            Response.End();

        return RedirectToAction("Index");
    }

Кроме того, у меня проблема с нижней частью.Если я не остановил выполнение файла Excel в диспетчере задач, у меня возникает ошибка типа «невозможно получить доступ, поскольку он используется другим процессом»

   if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
            }

1 Ответ

0 голосов
/ 15 октября 2018

операции чтения и записи файла не могут использоваться другим процессом, если вы не закрыли в конце операции.

    workbook.Close(false, Type.Missing, Type.Missing);
    application.Quit();
    ViewBag.Docs = docs;
    TempData["docs"] = docs;
    return View("Success");

замените ваш код

Response.ClearContent();
Response.ContentType = "application/ms-word";
Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.doc", "WordFileName"));
Response.Charset = "";
System.IO.StringWriter stringwriter = new System.IO.StringWriter();
HtmlTextWriter htmlwriter = new HtmlTextWriter(stringwriter);
gv.RenderControl(htmlwriter);
Response.Write(stringwriter.ToString());
Response.End();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...