微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用C#Windows应用程序将字节中的图像写入MS WORD

我试图从FileStream , StreamWriter写入数据到一个word文件

当数据是文本格式(使用StreamWriter )时,它工作正常。 但是,当我用Binarywriter (用于将文字写入Word文档)尝试相同的方法时, Binarywriter Word文档写入不正确。

在下面的代码中, lstOrderedSpares[index].SparePicture是包含图像数据的字节数组。

我需要一个没有OPENXML的解决scheme。

.NET中的DLL可以使用不同的扩展名,例如MLL?

防止subprocess创build可见的窗口?

通过远程桌面提高WPF应用程序的速度?

成为“真正的pipe理员”(Windows),并在.NET C#中执行真正的pipe理任务?

Windows服务 – 安装2份

这是我迄今为止所尝试的:

这里是我的button点击我初始化的数据类和List

private void btnCreateQuotation_Click(object sender,EventArgs e) { try { Quotation aQuotation = new Quotation(); aQuotation.QuotationId = quotationId; aQuotation.QuotationDate = lblQuotationDateValue.Text; //Reading from Datagridview and adding to List<Spare> List<Spare> lstOrderedSpares = new List<Spare>(); if (dataGridView1.Rows.Count > 0) { foreach (DataGridViewRow dr in dataGridView1.Rows) { Spare aSpare = new Spare(); aSpare.SapreSerialNumber = dr.Cells["SlNo"].Value.ToString(); aSpare.SparePartId = dr.Cells["SparePartID"].Value.ToString(); aSpare.SparePicture = (byte[])dr.Cells["SparePicture"].Value; aSpare.SpareDescription = dr.Cells["SpareDescription"].Value.ToString(); aSpare.EURPrice = Convert.Todouble(dr.Cells["EURPrice"].Value.ToString()); aSpare.Quantity = Convert.Todouble(dr.Cells["Quantity"].Value.ToString()); aSpare.TotalPrice = Convert.Todouble(dr.Cells["TotalPrice"].Value.ToString()); aSpare.DeliveryCharge = Convert.Todouble(txtDeliveryCharge.Text.Trim()); aSpare.Vat = txtVAT.Text.Trim(); aSpare.INRPrice = Convert.Todouble(dr.Cells["INRPrice"].Value.ToString()); lstOrderedSpares.Add(aSpare); } } Contact aContact = new Contact(); aContact.CompanyName = txtCustomerName.Text.Trim(); aContact.ContactName = cmbContactPersonName.Text; aContact.ContactId = Convert.ToInt32(lblContactPeronIdValue.Text); aContact.CompanyId = Convert.ToInt32(lblCustomerIDValue.Text); string fileName = "SparePart_" + aQuotation.QuotationId + "_"; string fileNameWithPath = "C:\Quotations\SpareQuotations\" + fileName; if (isaddedtodb) { CreateDocument(aQuotation,aContact,lstOrderedSpares,fileNameWithPath); fileNameWithPath = fileNameWithPath + aContact.CompanyName.Trim() + ".doc"; btnCreateQuotation.Visible = false; this.Hide(); //start ms word to open the document System.Diagnostics.Process.Start(fileNameWithPath); } } catch (Exception objEx) { } }

这里是将数据写入Word文档的CreateDocument方法

private void CreateDocument(Quotation aQuotation,Contact aContact,List<Spare> lstOrderedSpares,string fileNameWithPath) { try { _Application oWord = new Microsoft.Office.Interop.Word.Application(); _Document odoc = oWord.Documents.Add(); oWord.Visible = true; //modify secondparameter to include customer name in file name fileNameWithPath = fileNameWithPath + aContact.CompanyName.Trim() + ".doc"; //Insert text Range rng = odoc.Range(); rng.Text = "TSV/" + aQuotation.EnquiredBy.ToString() + "/JS/" + aQuotation.QuotationId + "/SPARES" + "t" + "t" + "t" + "t" + "t" + aQuotation.QuotationDate; //oWord.Selection.EndKey(); //oWord.Selection.TypeParagraph(); rng.InsertBreak(); rng.Text = "To,"; rng.InsertBreak(); rng.Text = "M/s. " + aContact.CompanyName + ","; rng.InsertBreak(); rng.Text = aContact.AddressLine1 + ","; rng.InsertBreak(); rng.Text = aContact.AddressLine2 + ","; rng.InsertBreak(); rng.Text = aContact.City + "," + aContact.State + ","; rng.InsertBreak(); rng.Text = aContact.Country + "-" + aContact.PinNo; rng.InsertBreak(); rng.Text = "Phone : " + aContact.PhoneNo; rng.InsertBreak(); rng.Text = "Mobile No : " + aContact.MobileNo; rng.InsertBreak(); rng.InsertBreak(); //Salutation and subject rng.Text = "t" + "t" + "Kind Attention : " + aContact.ContactName; rng.InsertBreak(); rng.Text = "Dear Sir,"; rng.InsertBreak(); rng.Text = "Sub: " + aQuotation.Subject; rng.InsertBreak(); rng.Text = "Ref: your email enquiry dt: " + aQuotation.EmailEnquiredDate; rng.InsertBreak(); rng.Text = "We thank you for your valuable email enquiry dt. " + aQuotation.EmailEnquiredDate + " for supply of spares for your .........Capacity," + " fabrik nos Sl. No :.................."; rng.InsertBreak(); rng.InsertBreak(); int europeancount = 0; for (int index = 0; index < lstOrderedSpares.Count; index++) { if (lstOrderedSpares[index].INRPrice == 0.00) { europeancount++; } } rng.Text = "A) We wish to inform you that the following " + europeancount + " spares can be supplied directly by in Euros."; rng.InsertBreak(); rng.InsertBreak(); int tempslno1 = 0; for (int index = 0; index < lstOrderedSpares.Count; index++) { if (lstOrderedSpares[index].INRPrice == 0.00) { tempslno1++; rng.Text = tempslno1 + "." + lstOrderedSpares[index].SpareDescription.toupper() + " : ARTICLE NO: " + lstOrderedSpares[index].SparePartId + "t" + Math.Round(lstOrderedSpares[index].EURPrice) + lbleuroSymbol.Text + "(" + new NumberToEnglish().changeCurrencyToWords(Math.Round(lstOrderedSpares[index].EURPrice)) + ")"; //To insert a picture from a byte array you need to use the Clipboard to paste it in object endOfContent = odoc.Content.End - 1; Range rngPic = odoc.Range(endOfContent); //Here is the trick to convert the ByteArray into an image and paste it in the document Image sparePicture = ByteArrayToImage(lstOrderedSpares[index].SparePicture); Clipboard.SetDataObject(sparePicture); rngPic.Paste(); rng.InsertBreak(); } } rng.InsertBreak(); rng.InsertBreak(); rng.Text = "Price Quoted Ex-works ."; rng.InsertBreak(); rng.Text = "Freight/Courier,Insurance,duties,any and all other expenses extra to " + "customers account."; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "HOW TO ORDER :- Please register your order in favour of ...."; rng.InsertBreak(); rng.Text = "PAYMENT :- Full payment in advance against proforma invoice from ...." + " through their bankers ..... "; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "Delivery / dispatch: 2 Weeks from the date of receipt of payment."; rng.InsertBreak(); rng.Text = "In case if you have account with ...then kindly mention the account number," + "since it will be economical if send via ...."; rng.Text = "Please provide your 'IEC Code number'."; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "B) We wish to inform you that the following spare can be supplied from ex-stock " + "our Office in INR"; rng.InsertBreak(); int tempslno2 = 0; for (int index = 0; index < lstOrderedSpares.Count; index++) { if (lstOrderedSpares[index].INRPrice != 0.00) { tempslno2++; rng.Text = tempslno2 + "." + lstOrderedSpares[index].SpareDescription.toupper() + " : ARTICLE NO: " + lstOrderedSpares[index].SparePartId + "t" + Math.Round(lstOrderedSpares[index].INRPrice) + " " + lblINRSymbol.Text + "(" + new NumberToEnglish().changeNumericToWords(Math.Round(lstOrderedSpares[index].INRPrice)) + ")"; //To insert a picture from a byte array you need to use the Clipboard to paste it in object endOfContent = odoc.Content.End - 1; Range rngPic = odoc.Range(endOfContent); //Here is the trick to convert the ByteArray into an image and paste it in the document Image sparePicture = ByteArrayToImage(lstOrderedSpares[index].SparePicture); Clipboard.SetDataObject(sparePicture); rngPic.Paste(); rng.InsertBreak(); } } rng.Text = "Price quoted ex-our office"; rng.InsertBreak(); rng.Text = "Taxes: VAT TNGST @ " + lstOrderedSpares[0].Vat + "% extra"; rng.InsertBreak(); rng.Text = "Delivery/Despatch: on receipt of order along with payment"; rng.Text = "Delivery/Courier Charges - extra " + lstOrderedSpares[0].DeliveryCharge.ToString() + "/-"; rng.InsertBreak(); rng.Text = "The order & payment may please be released in favour of..."; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "Payment: Full payment in advance by way of Electronic Transfer as per following details :"; rng.InsertBreak(); rng.Text = "Current Account Number: ......"; rng.InsertBreak(); rng.Text = "IFSC Code: .........."; rng.InsertBreak(); rng.Text = "Name of the account holder: ........."; rng.InsertBreak(); rng.Text = "t" + "t" + "t" + "OR"; rng.InsertBreak(); rng.Text = "By way of Demand Draft"; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "Offer validity 30 days"; rng.InsertBreak(); rng.Text = "Thanking you and awaiting your valuable instructions to fulfill your needs well in time."; rng.InsertBreak(); rng.InsertBreak(); rng.Text = "Yours sincerely"; rng.InsertBreak(); oWord.Selection.EndKey(); oWord.Selection.TypeParagraph(); odoc.SaveAs(fileNameWithPath); //If you're creating a document odoc.Close(); oWord.Quit(); } catch (Exception objEx) { } } public Image ByteArrayToImage(byte[] byteArrayIn) { MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); returnImage = ResizeImage(returnImage,new Size(30,30)); return returnImage; } public static Image ResizeImage(Image imgToResize,Size size) { return (Image)(new Bitmap(imgToResize,size)); }

使用.NET(C#)获取所有打开的窗口的位置和大小

如何将对象转换为未知types为T的IList <T>

C#:什么是最快的方式来生成一个唯一的文件名?

有没有办法通过局域网caching和分发Visual Studio更新?

将两个RichTextBox内容附加为单个RichTextstring

当你创建一个文件,例如C: Temp MyWordDoc.doc,并使用FileStream和StreamWriter将数据写入它时,实际上是将信息写入文本文件

doc或docx文件扩展名会导致Microsoft Word打开该文件,但它不是Word格式的文本。

您需要使用MS Word对象模型将图片添加到Word文档中。 为此,请在项目中引用Microsoft.Office.Interop.Word .Net DLL并尝试下面的代码

using Microsoft.Office.Interop.Word; using System.IO; private void btnCreateQuotation_Click(object sender,EventArgs e) { var spareList = new List<Spare>(); spareList.Add(new Spare{ SparePicture = ImagetoByteArray(Image.FromFile(@"C:temp11.png"))}); spareList.Add(new Spare { SparePicture = ImagetoByteArray(Image.FromFile(@"C:temp1.png")) }); CreateDocument(@"C:TempMyWordDoc.docx",spareList); } public void CreateDocument(string docFilePath,List<Spare> lstOrderedSpares) { Microsoft.Office.Interop.Word._Application oWord = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word._Document odoc = oWord.Documents.Add(); //If you're creating a document //Microsoft.Office.Interop.Word._Document odoc = oWord.Documents.Open(docFilePath,ReadOnly: false,Visible: true); //If you're opening a document //To see whats going on while populating the word document set Visible = true oWord.Visible = true; //Insert text Object oMissing = System.Reflection.Missing.Value; var oPara1 = odoc.Content.Paragraphs.Add(ref oMissing); oPara1.Range.Text = "First Text"; oPara1.Range.InsertParagraphAfter(); //Here is the trick to insert a picture from a byte array into MS Word you need to //convert the ByteArray into an Image and using the Clipboard paste it into the document Image sparePicture = ByteArrayToImage(lstOrderedSpares[0].SparePicture); Clipboard.SetDataObject(sparePicture); var oPara2 = odoc.Content.Paragraphs.Add(ref oMissing); oPara2.Range.Paste(); oPara2.Range.InsertParagraphAfter(); //Insert some more text var oPara3 = odoc.Content.Paragraphs.Add(ref oMissing); oPara3.Range.Text = "Second Text" + Environment.NewLine; oPara3.Range.InsertParagraphAfter(); sparePicture = ByteArrayToImage(lstOrderedSpares[1].SparePicture); Clipboard.SetDataObject(sparePicture); var oPara4 = odoc.Content.Paragraphs.Add(ref oMissing); oPara4.Range.Paste(); oPara4.Range.InsertParagraphAfter(); odoc.SaveAs(docFilePath); //If you're creating a document //odoc.Save(); //If you're opening a document odoc.Close(); oWord.Quit(); } public Image ByteArrayToImage(byte[] byteArrayIn) { using (MemoryStream ms = new MemoryStream(byteArrayIn)) { Image returnImage = Image.FromStream(ms); return returnImage; } } //Method I use to test loading images from disk into byte[]'s and inserting them into word public byte[] ImagetoByteArray(System.Drawing.Image imageIn) { byte[] result = null; using (MemoryStream ms = new MemoryStream()) { imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); result = ms.ToArray(); } return result; }

这是结果:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐