Сгенерированный файл Excel, по-разному показывающий значение даты в разных системах (веб-приложение Asp.net) - PullRequest
0 голосов
/ 11 мая 2019

У меня есть веб-приложение asp.net, которое отправляет электронную почту пользователям с вложением .xls, этот файл имеет несколько столбцов, в которых отображается дата, поэтому, когда пользователи загружают этот файл excel в свои системы, только пользователи, чьи настройки системы находятся в формат дд-мм-гггг дата отображается правильно, всем остальным пользователям, чьи настройки системы не в формате дд-мм-гггг, столбец даты отображается некорректно.

Любая идея, как это можно исправить, требуется, чтобы столбец даты отображался в формате дд-мм-гггг, независимо от настроек времени пользователя

Я использую приведенные ниже строки кода для отправки файла .xls по электронной почте

 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] !='-'

1 Ответ

1 голос
/ 11 мая 2019

Ты не должен этим заниматься.Если вы отправляете лист Excel, даты должны отображаться пользователю как таковые.Позвольте Excel отображать дату в соответствии с настройками системы пользователя.Не устанавливайте формат заранее.Если вы это сделаете, то пользователь получит даты в виде строк и должен будет преобразовать их, чтобы сделать что-нибудь полезное с данными.Кроме того, есть ли причина, почему вы отправляете xls вместо xlsx?Учитывая, что это происходит по электронной почте, пользователи будут намного счастливее, загружая файлы xlsx, поскольку они гарантированно не содержат макросы.Xls считаются более опасными, и многие почтовые клиенты не позволяют пользователю открыть xls именно по этой причине.

EDIT

После просмотра вашего кода я понимаю проблему более четко.То, что вы производите, не является настоящей таблицей Excel;это просто текстовый файл, к которому вы добавили расширение .xls.

Чтобы понять разницу, создайте новую электронную таблицу Excel, введите некоторые образцы данных, а затем сохраните их в формате xls (формат Excel 97).Теперь откройте файл в блокноте и посмотрите, что вы получите.Теперь откройте файл, который вы генерируете с помощью своего кода.

Что здесь происходит?Excel достаточно умен, чтобы признать, что, хотя ваш сгенерированный файл имеет неправильное расширение (т. Е. Содержимое файла не соответствует требуемому для xls), он имеет данные, которые он может отображать в электронной таблице, и поэтому его удобно загружать.

Изменение вашего расширения на xlsx не помогает.

У вас есть два варианта: 1) быть честным и использовать расширение, соответствующее формату вашего сгенерированного файла (* .txt, * .csv и т. Д.)) или 2) вам нужно сгенерировать книгу Excel как собственный файл Excel.

Если вы выберете последний путь, есть различные варианты: 1) использовать библиотеки взаимодействия Office, 2) использовать сторонние библиотеки Excel (некоторые из которых бесплатны - пожалуйста, библиотеку Google c # Excel) или 3) создать свойсобственная библиотека.Мне лично пришлось пойти на 3), так как проблема с 1) заключается в том, что Office необходимо установить на веб-сервере, а с 2) это либо стоит денег, либо это означает, что при использовании свободного программного обеспечения мой работодатель, как правило, недоволен.

Если вы хотите сделать 3) Я могу вам помочь.Первым шагом, который я рекомендую, является создание образца файла xlsx в Excel и его сохранение.Затем измените расширение в Explorer на .zip (да !!) и распакуйте.Затем изучите содержимое.Вы найдете это интересным, но это то, что вам нужно будет создать.Это не легко, но может быть сделано с помощью встроенных функций в .Net.

EDIT 2)

Если вы решите пойти по маршруту CSV (и я не уверен, что то, что у вас есть)здесь действительно csv, вам нужно открыть сгенерированный файл, чтобы быть уверенным), тогда он в настоящее время будет работать корректно только для систем с форматами даты dd-mm-yyyy.Чтобы она работала для любой локали, вам нужно, чтобы дата была в формате ISO 8601 (т.е. гггг-мм-дд).Для этого у вас есть два варианта.Во-первых, измените вашу хранимую процедуру для форматирования даты при генерации данных, таким образом:

SELECT CONVERT(varchar(10), your_date, 126) AS your_date FROM your_table;

(обратите внимание, что вы должны предоставить псевдоним для выходного столбца, в противном случае он получает Expr1 и т. Д.).Во-вторых, вы можете добавить DataColumn в DataTable после извлечения данных, пройтись по строкам вашего DataTable и назначить новый столбец с форматированной версией столбца даты в формате ISO 8601, а затем удалить уже существующий столбец даты.Сделайте все это, прежде чем генерировать вывод текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...