本文讲述了C#小程序之EXCEL转程TS!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
最近在做QT的小语种翻译,需要根据提供的翻译文件(excel),生成对应的ts文件,然后再编译成qm文件给程序调用。由于涉及的资源比较多,将近上千条,一条条查找、粘贴、替换太麻烦,所以就做个工具代劳下。
题外话:
一开始本来是用MFC做的,后来遇到个问题解决不了就改成C#了,用MFC的 tinyxml 更新 ts文件时,波兰语的尖音符写到文件中就变样了,无奈~
程序运行如下:
详细代码如下:(由于没有C#基础,所以代码就将就着看吧~)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Data.OleDb;
namespace ES_TransTool
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 保存从excel中读取的翻译源
/// </summary>
public Dictionary<string, string> m_dicSouce = new Dictionary<string, string>();
/// <summary>
/// 根据字典内容设置ts文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int nSucessNum = 0;
//string xmlpath = System.AppDomain.CurrentDomain.BaseDirectory + "LocalMaintSystem_en.ts";
string xmlpath = string.Empty;
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "TS文件(*.xml;*.ts)|*.xml;*.ts|所有文件|*.*";
ofd.ValidateNames = true;
ofd.CheckPathExists = true;
ofd.CheckFileExists = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
xmlpath = ofd.FileName;
}
XmlDocument doc = new XmlDocument();
doc.Load(xmlpath);
XmlNode xnTs = doc.SelectSingleNode("//TS");
XmlNodeList xnTsList = xnTs.ChildNodes;
foreach (XmlNode xnTsChild in xnTsList)
{
if (xnTsChild.Name == "context")
{
XmlNodeList xnList = xnTsChild.ChildNodes;
foreach (XmlNode xnf in xnList)
{
XmlElement xe = (XmlElement)xnf;
if (xe.Name == "message")
{
XmlNodeList xnf1 = xe.ChildNodes;
foreach (XmlNode xn2 in xnf1)
{
/* 用英文替换,使用translation节点
if (xn2.Name.CompareTo("translation") == 0)
{
string translationText = xn2.InnerText;
if (m_dicSouce.ContainsKey(translationText))
{
//修改节点translation的值
xn2.InnerText = m_dicSouce[translationText];
nSucessNum++;
}
}
*/
//用中文替换,使用source节点
if (xn2.Name.CompareTo("source") == 0)
{
string sourceText = xn2.InnerText;
XmlNode xnTranslation = xn2.NextSibling;
if (xnTranslation.Name == "translation")
{
if (m_dicSouce.ContainsKey(sourceText))
{
//修改节点translation的值
xnTranslation.InnerText = m_dicSouce[sourceText];
nSucessNum++;
}
}
}
}
}
}
}
}
doc.Save(xmlpath);
MessageBox.Show(nSucessNum.ToString() + "elements trans success!");
}
/// <summary>
/// 把获取到的数据保存到字典中
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
}
/// <summary>
/// 从excel中获取需要翻译的资源,保存到DataTable
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static DataTable ReadExcelToTable(string path)
{
try
{
string strConn;
// strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=False;IMEX=1'";
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=YES\"";
OleDbConnection OleConn = new OleDbConnection(strConn);
OleConn.Open();
String sql = "SELECT * FROM [Sheet1$]";//可是更改Sheet名称,比如sheet2,等等
OleDbDataAdapter OleDaExcel = new OleDbDataAdapter(sql, OleConn);
DataSet OleDsExcle = new DataSet();
OleDaExcel.Fill(OleDsExcle, "Sheet1");
OleConn.Close();
return OleDsExcle.Tables["Sheet1"];
}
catch (Exception err)
{
MessageBox.Show("数据绑定Excel失败!失败原因:" + err.Message, "提示信息",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return null;
}
}
/// <summary>
/// 选择翻译文件excel并加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button3_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx|所有文件|*.*";
ofd.ValidateNames = true;
ofd.CheckPathExists = true;
ofd.CheckFileExists = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
textBox1.Text = ofd.FileName;
//加载excel
DataTable dt;
dt = ReadExcelToTable(ofd.FileName);
dataGridView1.DataSource = dt;
//把datatable中的数据保存到m_dicSouce中
int nCount = dt.Rows.Count;
for (int i = 0; i < nCount; ++i)
{
string strKey = dt.Rows[i][0].ToString();
string strValue = dt.Rows[i][2].ToString();
m_dicSouce[strKey] = strValue;
}
MessageBox.Show("当前加载元素个数:" + m_dicSouce.Count.ToString());
}
}
}
}
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!