首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成的Excel文件在不同的系统中以不同的方式显示日期值( Asp.net web应用程序)

生成的Excel文件在不同的系统中以不同的方式显示日期值( Asp.net web应用程序)
EN

Stack Overflow用户
提问于 2019-05-11 14:20:42
回答 1查看 405关注 0票数 0

我有asp.net网络应用程序,它发送电子邮件给用户的.xls附件,这个文件有几列显示日期,所以当用户下载这个excel文件在三个系统中,只有用户的系统设置是在dd-mm-yyyy格式的日期是正确显示,对所有其他用户的系统设置不是在dd-mm-yyyy格式它没有正确显示的日期列是不正确的。

如果知道如何解决这个问题,要求是让日期列以dd-mm-yyyy格式显示,而不考虑用户的时间设置

我使用以下几行代码通过电子邮件发送.xls文件

代码语言:javascript
复制
 using (StreamReader stRDR = new StreamReader(Server.MapPath("~/2.1.3.2-B-MAILER.html")))
                {
                    sHTMLbody = stRDR.ReadToEnd();
                    sHTMLbody = sHTMLbody.Replace("{NAME}", sSalesL2name.ToString());
                    sHTMLbody = sHTMLbody.Replace("{MESSAGEBODY}", sMsgBodyTemplate);
                }
                var dtServer = DateTime.Now;
                string FileName = "SalesL2_" + sSalesL2sapcode + ".xls";
                String sPath = Path.GetTempPath() + FileName;
                //String sPath = Path.GetTempPath() + sL3sapcode.ToString() + dtServer.ToString("_yyyy-MM-dd__HH-mm-ss") + ".xls";
                FileInfo FI = new FileInfo(sPath);
                StringWriter stringWriter = new StringWriter();
                HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWriter);
                // For the below line to work, we need [override void VerifyRenderingInServerForm as part of class]
                GridView gvTemp = new GridView();
                gvTemp.AllowPaging = false;
                gvTemp.DataSource = dtResult;
                gvTemp.DataBind();
                gvTemp.RenderControl(htmlWrite);
                gvTemp = null;
                System.IO.StreamWriter vw = new System.IO.StreamWriter(sPath, true);
                stringWriter.ToString().Normalize();
                vw.Write(stringWriter.ToString());
                vw.Flush();
                vw.Close();
                Attachment attXLS = new Attachment(FI.FullName);
                //"application/vnd.ms-excel";
                // Send Email
                // Create new Mail Object
                objMail = new MailMessage(); // Create new Mail Object
                objMail.From = new MailAddress("ersdocumenttracking@hcl.com");

**Stored proc**
select distinct t1.[Project code],t1.[Project Description],t1.[Start Date],
t1.[End Date],t1.[Customer],t1.[Customer Name],t1.[Customer Group],
[AM Sales SAPID],[AM Sales Name],[L3 Sales SAPID],[L3 Sales Name],[L2 sales SAPID],[L2 sales Name],
t1.[Proj Category Description],t1.[DU Desc (L4)],t1.[SDU Name (L3)],
t1.[PM Code],t1.[PM Name],t1.[VBDU Desc (L2)],t1.[SPM Code],t1.[SPM Name],t1.[DUH Code],t1.[DUH Name],
t1.[SDUH Code],t1.[SDUH Name],[VBDUH Code],[VBDUH Name],[Geo Reg Name],[Customer SOW],t1.[MSA],
[MSA Start Date],[MSA End Date],[SOW Start Date],[SOW End Date],[Document applicability],
[Avg Rev based on AMJ '18 PP (in $K)] [Avg Rev based on last quarter PP (in $K)],[UAR $K],
[MSA RAG check],[SOW RAG check],
[PONumber],[POValidFrom],[POValidTo],[Balance in $K],
[PO RAG check],[PO Insufficient flag],[MSA Documents remarks], [SOW Documents remarks],
[PO Documents remarks] 
from [tbl_MSA_SOW] as t1 left join [tbl_PO] as t2 
on t1.[Project code] = t2.[Project Code]
inner join [tbl_Sales_mapping] as t3 
on t1.[Project code]=t3.[Project code] 
where (t1.[MSA RAG check]=@RagValue or t1.[SOW RAG check]=@RagValue
or t2.[PO RAG check]=@RagValue) 
and t3.[L2 sales SAPID]=@sapid and t3.[AM Sales Name] !='-'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-11 14:32:50

你不应该这么做。如果您发送的是excel工作表,则应向用户显示日期。让excel根据用户的系统设置显示日期。请勿预设格式。如果您这样做了,那么用户将获得字符串形式的日期,并且必须对它们进行转换,以便对数据执行任何有用的操作。另外,有没有什么原因,为什么你发送的是xls而不是xlsx?考虑到这是通过电子邮件进行的,用户将更乐意下载xlsx文件,因为它们被保证不包含宏。Xls被认为是更危险的,许多电子邮件客户端阻止用户打开xls,正是出于这个原因。

编辑

看过你的代码后,我更清楚地理解了这个问题。您生成的并不是真正的Excel电子表格;它只是一个添加了.xls扩展名的文本文件。

要了解其中的区别,请创建一个新的Excel电子表格,输入一些示例数据,然后将其另存为xls (Excel 97格式)。现在在记事本中打开该文件,看看会得到什么。现在打开通过代码生成的文件。

这是怎么回事?Excel足够聪明,能够识别出,尽管您生成的文件具有错误的扩展名(即文件的内容不是xls所需的内容),但它具有可以在电子表格中显示的数据,因此可以方便地加载它。

将扩展名更改为xlsx没有任何帮助。

您有两个选择: 1)诚实并使用适合您生成的文件(*.txt、*.csv等)格式的扩展名;2)您需要将Excel工作簿生成为本地Excel文件。

如果您选择后一种方法,有多种选择: 1)使用c#互操作性库,2)使用第三方Excel库(其中一些是免费的-请使用Google OfficeExcel库)或3)生成您自己的库。我个人不得不选择3)因为1) Office需要安装在web服务器上,2)它要么需要花钱,要么意味着使用自由软件,而我的雇主通常不愿意这样做。

如果你想做,我可以给你一些帮助。我建议的第一步是在Excel中创建一个示例xlsx文件并保存它。然后将资源管理器中的扩展名更改为.zip (是!!)然后提取。然后检查内容。您会发现它很有趣,但这正是您需要创建的。这并不容易,但可以使用.Net中的内置函数来完成。

编辑2)

如果您选择csv路线(我不确定您在这里拥有的是否真的是csv,您需要打开生成的文件以确保),那么它目前只能在dd-mm-yyyy日期格式的系统上正常工作。要使其适用于任何区域设置,您需要日期格式为ISO 8601 (即yyyy-mm-dd)。要做到这一点,您有两个选择。首先,在生成数据时更改存储过程以格式化日期,如下所示:

代码语言:javascript
复制
SELECT CONVERT(varchar(10), your_date, 126) AS your_date FROM your_table;

(请注意,您应该为输出列提供别名,否则将得到Expr1等)。其次,您可以在检索数据后向DataTable中添加一个DataColumn,遍历DataTable的各行,并为新列分配已有日期列的ISO8601格式版本,然后删除已有日期列。在生成文本输出之前完成所有这些操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56087777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档