ResxWriter: 从 Excel 电子表格生成 .resx 文件






4.94/5 (19投票s)
2005年4月29日
2分钟阅读

149922

3490
从 Excel 电子表格生成 .resx 文件;完全可定制。
引言
这是我的第一篇文章,请多多包涵 :) 我想和大家分享这个,因为我认为 ResxWriter 具有一些非常好的功能和一些很棒的特性。 细分
- 使用 ADO.NET 和 Excel 电子表格生成 .resx 文件。
- 完全可定制。
- 设置是针对每台机器用户的。
- 干净卸载,带启动器。
ResxWriter 是一个 .NET 工具,可以读取包含用于翻译的数据的 Excel 电子表格,并将这些数据转换为单独的 .resx 文件。
最近,我正在开发一个 ASP.NET 应用程序,该应用程序需要对所有静态文本进行全面翻译。 我们使用了 .NET 资源文件 (.resx),一切进展顺利。 然而,更新文本是另一回事。 至少可以说,使用 Visual Studio 手动更新 .resx 文件很麻烦。 如果你使用 IDE,格式化很痛苦,尽管格式化 XML 也是一个选项…
相反,我决定编写一个应用程序,该应用程序将从 Excel 电子表格中获取数据并生成 .resx 文件。 这使得我们的翻译人员可以使用他们熟悉的程序,并允许其他人共享文件进行工作。
读取 Excel 文件
假设你在电子表格中有以下数据
控件名称 | English | French |
BtnHello | 你好世界! | Bonjour Monde! |
LblHello | Hello World Again! | Bonjour Monde encore! |
ResxWriter 可以从每一列中提取数据并创建 .resx 文件。 可以使用任意数量的列,并且应用程序可以完全自定义。
public bool GetDataFromExcelFile(string filePath)
{
try
{
string strConnectionString =
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ filePath + @";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
OleDbConnection dbConn = new OleDbConnection(strConnectionString);
dbConn.Open();
string fetch = BuildCommand();
OleDbCommand cmdSelect = new OleDbCommand(fetch, dbConn);
OleDbDataAdapter dbAdapter = new OleDbDataAdapter();
dbAdapter.SelectCommand = cmdSelect;
dbAdapter.Fill(this.m_table);
dbConn.Close();
dbConn = null;
return true;
}
catch(System.Data.OleDb.OleDbException ex)
{
FrmMessage m = new FrmMessage();
m.SetMessageText("ResxWriter - Error Message",
"Cannot Load Excel File!\n\n\nException:\n\n"
+ ex.ToString());
m.ShowDialog();
return false;
}
}
写入资源文件
我创建了一个类 ClsLanguage
来封装名称-值功能。
[Serializable]
public class ClsLanguage
{
private string langColumnName;
private string langCulture;
public ClsLanguage() {}
public ClsLanguage(string columnName, string culture)
{
this.langColumnName = columnName;
this.langCulture = culture;
}
[XmlElement(ElementName = "LanguageColumnName")]
public string LanguageColumnName
{
get {return this.langColumnName;}
set {this.langColumnName = value;}
}
[XmlElement(ElementName = "LanguageCulture")]
public string LanguageCulture
{
get {return this.langCulture;}
set {this.langCulture = value;}
}
}
强类型集合 ClsLanguage
对象被写出为资源文件。
public void WriteResources(string filePath)
{
if (filePath.Length > 0)
{
// get columns //
foreach (ClsLanguage l in ClsMain.settings.LanguageCollection)
{
ResXResourceWriter rw =
new ResXResourceWriter(filePath + "." +
l.LanguageCulture + ".resx");
for (int i=0; i<this.m_table.Rows.Count; i++)
{
ClsMain.frmMain.WriteProgressBar.Visible = true;
ClsMain.frmMain.WriteProgressBar.Maximum = m_table.Rows.Count;
try
{
string name =
m_table.Rows[i][ClsMain.settings.ControlColumnName].ToString();
string valu = m_table.Rows[i][l.LanguageColumnName].ToString();
rw.AddResource(name, valu);
ClsMain.frmMain.WriteProgressBar.Increment(i);
}
catch (System.ArgumentException)
{
}
}
rw.Generate();
rw.Close();
}
ClsMain.frmMain.WriteProgressBar.Visible = false;
FrmMessage m = new FrmMessage();
m.SetMessageText("ResxWriter - Output Results",
"Files were written to: " + filePath);
m.ShowDialog();
}
}
关注点
应用程序设置(大小、位置和列名)通过一个类 ClsSettings
进行序列化。
[Serializable]
public class ClsSettings
{
private readonly string m_settingsPath =
Application.UserAppDataPath + @"\ResxWriter.xml";
private ClsLanguageCollection m_langCollection
= new ClsLanguageCollection();
private Size m_size = new Size(250, 175);
private Point m_location = new Point(200, 200);
private string m_controlColumnName;
private string m_sheetName;
public ClsSettings()
{
}
public string SettingsPath
{
get {return this.m_settingsPath;}
}
public ClsLanguageCollection LanguageCollection
{
get {return this.m_langCollection;}
}
public Size FormSize
{
get {return this.m_size;}
set {this.m_size = value;}
}
public Point FormLocation
{
get {return this.m_location;}
set {this.m_location = value;}
}
public string ControlColumnName
{
get {return this.m_controlColumnName;}
set {this.m_controlColumnName = value;}
}
public string SheetName
{
get {return this.m_sheetName;}
set {this.m_sheetName = value;}
}
}
这允许我使用几行代码保存(和加载)应用程序设置
XmlSerializer xs = new XmlSerializer(typeof(ClsSettings));
using (StreamWriter sw = new StreamWriter(xml, false))
{
ClsMain.settings.FormSize = ClsMain.frmMain.Size;
ClsMain.settings.FormLocation = ClsMain.frmMain.Location;
xs.Serialize(sw, ClsMain.settings);
}
此应用程序中的所有设置都特定于当前用户,保存在 /Documents and Settings/{用户名}/Application Data/...。 这与 Microsoft 的建议非常吻合,并允许每个用户拥有自己的体验和偏好。
我不喜欢应用程序卸载时没有删除它正在使用的所有文件。 所以,我制作了一个可以进行清理以实现真正卸载的应用程序。 它本质上会删除其当前位置中的所有目录和文件。 此外,(通过 Visual Studio) 创建卸载图标的唯一方法是创建一个卸载启动器。 在源代码中,启动器找到 MSI 文件使用的产品密钥。 这会触发修复或删除屏幕,并允许卸载。
(这些都包含在解决方案文件中作为单独的项目。)