page contents

C#小程序之EXCEL转程TS

本文讲述了C#小程序之EXCEL转程TS!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-10-IattFWeq6350ad46a62b6.png本文讲述了C#小程序之EXCEL转程TS!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

最近在做QT的小语种翻译,需要根据提供的翻译文件(excel),生成对应的ts文件,然后再编译成qm文件给程序调用。由于涉及的资源比较多,将近上千条,一条条查找、粘贴、替换太麻烦,所以就做个工具代劳下。

题外话:

一开始本来是用MFC做的,后来遇到个问题解决不了就改成C#了,用MFC的 tinyxml 更新 ts文件时,波兰语的尖音符写到文件中就变样了,无奈~

程序运行如下:

attachments-2022-10-dwEH6igV6350acecb8fc4.png

详细代码如下:(由于没有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电子书、教程、项目接单、源码等等

attachments-2022-10-kwwbZ9WG6347756cbf77c.jpg



  • 发表于 2022-10-20 10:07
  • 阅读 ( 296 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 1131 文章
  3. 小柒 1046 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章