Stackoverflow社区的好日子,
我需要一些专家协助。我有一个MVC4网络应用程序,有一些由TinyMCE提供支持的富文本框字段。到目前为止,系统运行良好。上周,我的客户告诉我他们想要将存储在Microsoft SQL中的数据导出到Excel以运行自定义报告。
我可以使用提供的代码将数据导出到excel。但是它以RTF而不是纯文本格式导出数据。这会在他们尝试阅读内容时引发问题。
由于缺乏知识和理解,我无法弄清楚这一点。我确实读过可以使用正则表达式执行此操作,但我不知道如何实现它。所以我求助于你。
public ActionResult ExportReferralData()
{
GridView gv = new GridView();
gv.DataSource = db.Referrals.ToList();
gv.DataBind();
Response.ClearContent();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment; filename=UnderwritingReferrals.xls");
Response.ContentType = "application/ms-excel";
Response.AddHeader("Content-Type", "application/vnd.ms-excel");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
gv.RenderControl(htw);
Response.Output.Write(sw.ToString());
Response.Flush();
Response.End();
return RedirectToAction("Index");
}
我真的很感激任何帮助。并提前谢谢你。
我在YouTube和网络论坛上寻找解决方案但没有取得任何成功。 亲切的问候 弗朗索瓦·穆勒
答案 0 :(得分:0)
您可以执行的一个选项是按下您写入XML文件的数据。
例如,在字符串中使用idenfity
并将其替换为string.Empty。
类似地
可以用string.Empty替换。
一旦确定了Rich Text HTML标签的所有变体,您就可以创建一个标签列表,并在FOR循环内部用适当的字符串替换每个标签。
答案 1 :(得分:0)
您是否尝试将文件另存为.xslx并发送给客户端。
较新的Excel格式可以更优雅地处理数据吗?
答案 2 :(得分:0)
将此函数添加到您的代码中,然后您可以调用在HTML字符串中传递它的函数。返回输出将是HTML免费的。
警告:这不适用于所有情况,不应用于处理不受信任的用户输入。请使用输入字符串的变体对其进行测试。
public static string StripTagsCharArray(string source)
{
char[] array = new char[source.Length];
int arrayIndex = 0;
bool inside = false;
for (int i = 0; i < source.Length; i++)
{
char let = source[i];
if (let == '<')
{ inside = true; continue; }
if (let == '>') { inside = false; continue; }
if (!inside) { array[arrayIndex] = let; arrayIndex++; }
}
return new string(array, 0, arrayIndex);
}
答案 3 :(得分:0)
所以我设法通过更改原始代码来解决此问题,如下所示: 由于我只想尝试转换几列,我发现这种方法运行良好。这将确保每个记录在Excel中按行分隔,并将Html转换为纯文本,以允许用户在Excel中添加列过滤器。
我希望这有助于任何其他有类似问题的人。
const MapWithAMakredInfoWindow = compose(
withScriptjs,
withGoogleMap
)(props =>
<GoogleMap
defaultZoom={8}
defaultCenter={{ lat: 44.8350088, lng: -0.5872689999999999 }}
>
{this.state.PartenaireData.map(function (item, i) {
if (item.coordinates.latitude && item.coordinates.longitude)
return (
compose(
withStateHandlers(() => ({
isOpen: false,
}), {
onToggleOpen: ({ isOpen }) => () => ({
isOpen: !isOpen,
})
})
)(markerProps =>
<Marker
position={{ lat: item.coordinates.latitude, lng: item.coordinates.longitude }}
onClick={markerProps.onToggleOpen}
key={i}
>
{(markerProps.isOpen) &&
<InfoWindow onCloseClick={markerProps.onToggleOpen}>
<div>
<div>{item.titre}</div>
<div >autre data</div>
</div>
</InfoWindow>}
</Marker>
)
);
})}
</GoogleMap>
);