.NET 导出图片到Excel中,打开不显示(或提示受保护)问题。

问题描述

.NET 导出图片到Excel中,打开不显示(或提示受保护)问题。

public static MemoryStream TablesToExcelForXLSX(DataTable dt, DataTable reportTable, string file, int timeCount, string exportAll, string exportDatasource, string exportChart, out byte[] buf)
{
//HSSFWorkbook
//POIDocument, IWorkbook, IList, ICollection, IEnumerable, IEnumerable

            //POIXMLDocument, IWorkbook, IList<ISheet>, ICollection<ISheet>, IEnumerable<ISheet>, IEnumerable
            HSSFWorkbook xssfworkbook = new HSSFWorkbook();
            string columnName = "";
            int tmpI = 0;
            if (exportAll == "1" || exportDatasource == "1")
            {
                #region chartsource table
                if (dt != null && dt.Rows.Count != 0)
                {
                    //sheet1
                    ISheet sheet = xssfworkbook.CreateSheet("DataSource");
                    //表头
                    IRow row = sheet.CreateRow(0);
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        columnName = dt.Columns[i].ColumnName;
                        if (columnName.ToLower() == "linecount" || columnName.ToLower() == "sort")
                        {
                            continue;
                        }
                        if (columnName.ToLower() == "enlinename")
                        {
                            columnName = "ProductLine";
                        }
                        if (columnName.ToLower() == "thetype")
                        {
                            columnName = "Type";
                        }
                        if (i > timeCount + 3) //只显示时间跨度内的字段,加3 是除时间字段外有3字段
                        {
                            continue;
                        }
                        ICell cell = row.CreateCell(tmpI);
                        cell.SetCellValue(columnName);
                        tmpI++;
                    }

                    //数据
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        tmpI = 0;
                        IRow row1 = sheet.CreateRow(i + 1);
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            if (j == 0 || j == 3)
                            {
                                continue;//过滤每行的lineCount和sort字段
                            }
                            if (j > timeCount + 3) //只显示时间跨度内的字段,加1 是除时间字段外有1字段
                            {
                                continue;
                            }
                            ICell cell = row1.CreateCell(tmpI);
                            var cellValue = dt.Rows[i][j].ToString();
                            if (tmpI == 0)//第一列为产品线名称
                            {
                                cellValue = (cellValue.IndexOf("cn:") == -1) ? cellValue : cellValue.Substring(cellValue.IndexOf("cn:") + 3);
                            }
                            cell.SetCellValue(cellValue);
                            tmpI++;
                        }
                    }
                }
                #endregion

                #region datasource table
                if (reportTable != null && reportTable.Rows.Count != 0)
                {
                    //sheet2
                    ISheet sheet2 = xssfworkbook.CreateSheet("ReportSource");
                    //表头
                    IRow row2 = sheet2.CreateRow(0);
                    tmpI = 0;
                    for (int i = 0; i < reportTable.Columns.Count; i++)
                    {
                        columnName = reportTable.Columns[i].ColumnName;
                        if (columnName.ToLower() == "sort")
                        {
                            continue;
                        }
                        if (columnName.ToLower() == "thetype")
                        {
                            columnName = "Type";
                        }
                        ICell cell = row2.CreateCell(tmpI);
                        cell.SetCellValue(columnName);
                        tmpI++;
                    }

                    //数据
                    for (int k = 0; k < reportTable.Rows.Count; k++)
                    {
                        tmpI = 0;
                        IRow row1 = sheet2.CreateRow(k + 1);
                        for (int j = 0; j < reportTable.Columns.Count; j++)
                        {
                            if (j == 1)
                            {
                                continue;//过滤每行sort字段
                            }
                            if (j > timeCount + 1) //只显示时间跨度内的字段,加1 是除时间字段之前有一个1字段
                            {
                                continue;
                            }
                            ICell cell = row1.CreateCell(tmpI);
                            cell.SetCellValue(reportTable.Rows[k][j].ToString());
                            tmpI++;
                        }
                    }
                }
                #endregion
            }
            if (exportAll == "1" || exportChart == "1")
            {
                #region 插入图片
                string imgpath = AppDomain.CurrentDomain.BaseDirectory + "/export/sellthrough_chart.png";
                if (File.Exists(imgpath))
                {
                    //create sheet
                    //HSSFSheet hssfSheet = (HSSFSheet)xssfworkbook.CreateSheet("Chart");
                    ISheet hssfSheet = xssfworkbook.CreateSheet("Chart");
                    //hssfSheet.Protect = false;
                    // Create the drawing patriarch.  This is the top level container for all shapes.
                    //HSSFPatriarch patriarch = (HSSFPatriarch)hssfSheet.CreateDrawingPatriarch();
                    IDrawing patriarch = hssfSheet.CreateDrawingPatriarch();

                    //add picture data to this workbook.
                    byte[] bytes = System.IO.File.ReadAllBytes(imgpath);
                    int pictureIdx = xssfworkbook.AddPicture(bytes, PictureType.PNG);

                    //add a picture
                    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 0, 0, 0, 15, 30);
                    //HSSFPicture pict = (HSSFPicture)patriarch.CreatePicture(anchor, pictureIdx);
                    IPicture pict = patriarch.CreatePicture(anchor, pictureIdx);
                }
                #endregion
            }
            //转为字节数组
            MemoryStream stream = new MemoryStream();

            xssfworkbook.Write(stream);
            buf = stream.ToArray();
            //var buf = stream.ToArray();
            /*
            //保存为Excel文件
            using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
            {
                fs.Write(buf, 0, buf.Length);
                fs.Flush();
            }*/
            return stream;
        }

解决方案

string name = "sell_through_datasource.xls";
string filename = AppDomain.CurrentDomain.BaseDirectory + name;
byte[] buf = null;
MemoryStream ms = CommonStruct.ExcelHelper.x2007.TablesToExcelForXLSX(dt, reportTable, filename, timeCount, exportAll, exportDatasource, exportChart,out buf);

        rs.AppendHeader("Content-Disposition", "attachment;filename=" + name);
        rs.ContentType = "application/ms-excel";
        rs.BinaryWrite(buf);
        //rs.WriteFile(filename);
        ms.Close();
        ms.Dispose();
        rs.Flush();
        rs.End();

解决方案二:

在.NET项目中做导出图片(已存在的图片)到excel中时,遇到个感觉跟奇怪的问题,为什么我本地机器测试可以正常导出和显示,使用IIS部署测试也是正常的。
别人的服务器上测试时,前2个sheet数据(文字格式)可以看到,而第三个sheet显示不出来。
有的情况打开excel后是不显示第三个sheet,有的打开后excel提示'受保护的视图'的信息。

解决方案三:

有大虾们遇到过这种情况吗 或者指点一二。 感激不尽~

时间: 2024-09-20 21:01:18

.NET 导出图片到Excel中,打开不显示(或提示受保护)问题。的相关文章

【百分求助】导出图片到excel

问题描述 现在做的页面中,一个是用MSChart生成的图片,图片下面有一个Gridview,现在实现了点击button将Gridview数据导出到指定的Excel中.想实现:将图片导入Excel中,放在第二个Sheet中.即第一个Sheet存放Gridview的表格,第二个Sheet存放图片. 解决方案 解决方案二:SF解决方案三:usingExcel解决方案四:用xml做.解决方案五:帮顶!!解决方案六:先读图片到stream里,再写入excel(纯想法未实现)解决方案七:操作多sheet,操

VB.NET 导出数据到EXCEL中

excel|导出数据 ----------VB.NET 导出数据到EXCEL中------------- Dim oExcel As New Excel.Application Dim obook As Excel.Workbook Dim oSheet As Excel.Worksheet Dim DataArray(2000, 2000) As Integer obook = oExcel.Workbooks.Open("c:\1.xls") oSheet = obook.Work

VB.NET导出数据到EXCEL中

----------VB.NET 导出数据到EXCEL中------------- 在引用当中引入Microsoft Excel 11.0 Object Library Dim oExcel As New Excel.Application Dim obook As Excel.Workbook Dim oSheet As Excel.Worksheet Dim DataArray(2000, 2000) As Integer obook = oExcel.Workbooks.Open("c:\

vs2012-从datagrid导出数据到excel中出现错误

问题描述 从datagrid导出数据到excel中出现错误 private void button2_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.Rest

android canvas保存为图片在手机中打开是一片黑色

问题描述 android canvas保存为图片在手机中打开是一片黑色 //保存 public void save() { File sd=Environment.getExternalStorageDirectory(); String path=sd.getPath()+"/paint"; File file=new File(path); file.mkdir(); Bitmap bm = Bitmap.createBitmap(480, 800, Config.ARGB_888

在Excel中如何正确显示出长串数字?

  有的时候我们在excel表格中输入了一长串数字,但是显示不出来,这种情况很让人困恼,那么如何正确显示成这样的长串数字呢"6217001630005541399".下面小编就为大家介绍一下,来看看吧! 手动修改数字格式 [1]原因:Excel自动把长串数字转换成科学计数法,如果需要显示成长串数字就要将数据显示格式转换过来. [2]单击选中需要修改的单元格,鼠标右键单击,在选项菜单中选中"设置单元格格式" [3]在数字项,左侧菜单中选中"数值"并

电脑中打开FineReader 12软件提示RPC服务不可用的解决方法

  电脑中打开FineReader 12软件提示RPC服务不可用的解决方法         1.打开开始菜单--控制面板--管理工具; 2.打开服务,在服务列表中找到服务项:ABBYY FineReader 12 PE Licensing Service; 3.双击打开属性,将启动类型设置为"自动",点击确定; 4.然后右击ABBYY FineReader 12 PE Licensing Service,选择启动或重新启动即可.

imageview-如何让图片在ImageView中全屏显示?

问题描述 如何让图片在ImageView中全屏显示? 在ScrollView中嵌套Linearlayout,在linearlayout布局中有很多的ImageView控件,然后在代码中添加帧动画,imageview指定大小时(比如layout_width="50dp"),图片可以正常显示,但是做屏幕适配的时,将imageview的layout_width和layout_height设置为match_parent后,所有的图片都是缩小显示,这是为什么?如何做才可以将图片全屏显示? 解决方

winform-C# Winform项目中, 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

问题描述 C# Winform项目中, 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. C/C++ 代码,这个是第三方提供的外部方法(调用"华大HD-900身份证阅读器接口函数"):int HD_Read_BaseInfo(char* pBmpData char *pName char *pSex char *pNation char *pBirth char *pAddress char *pCertNo char *pDepartment char *pEffectData